1. 程式人生 > >數據結構 第5章 樹的二叉樹 單元小結(2)遍歷二叉樹和線索二叉樹

數據結構 第5章 樹的二叉樹 單元小結(2)遍歷二叉樹和線索二叉樹

進行 深度 bsp iteration oid 基礎 二叉樹 線索 push

概念:

遍歷二叉樹:

遍歷:指按某條搜索路線遍訪每個結點且不重復(又稱周遊)。

遍歷的用途:它是樹結構插入、刪除、修改、查找和排序運算的前提,是二叉樹一切運算的基礎和核心。

時間效率: O(n) //每個結點最多訪問兩次

空間效率: O(n) //棧占用的最大輔助空間

用棧進行叠代運算 和隊列很像

先序:                    中序:

void PreOrderlteration(BiTree T)            void InOrderIteration(BiTree T)

{  stack<BiTree> s;              stack<BiTree> s;

  BiTree p;                  BiTree p = T;

  if(T!=NULL) s.push(T);            while(p!=NULL || !s.empty()){

  while(!s.empty()){               while(p!=NULL){//一直走到左盡頭

    p=s.top();                  s.push(p);//根節點進棧

    s.pop();                   p==p->lchild;//遍歷左子樹}

    cout<<p->data<<" ";             p = s.top();//左已訪問右未訪問

    if(p->rchild!=NULL) s.push(p->rchild);     s.pop();

    if(p->lchild!=NULL) s.push(p->lchild);      cout<<p->data<<" ";

}                          p=p->rchild;//準備遍歷右子樹

復制二叉樹:                      計算二叉樹的深度

void Copy(BiTree T, BiTree &NewT)              int Depth(BiTree T){

{//先序復制二叉樹                      //返回二叉樹的深度

if (T==NULL) { NewT = NULL; return; } //遞歸結束,建空樹 if(T==NULL) return 0;//空樹,深度為0

else {                        else{

NewT = new BiTNode;                  m=Depth(T->lchild);

NewT->data = T->data ; //復制根結點            n=Depth(T->rchild);

Copy(T->lchild, NewT->Lchild); //復制左子樹        if(m>n) return(m+1);

Copy(T->rchild, NewT->rchild); //復制右子樹 }        else return(n+1);}

}

計算二叉樹結點總數:

int NodeCount(BiTree T)

{

if(T==NULL) return 0;

else return NodeCount(T->lchild) +NodeCount(T->rchild)+1;

}

數據結構 第5章 樹的二叉樹 單元小結(2)遍歷二叉樹和線索二叉樹