數據結構 第5章 樹的二叉樹 單元小結(2)遍歷二叉樹和線索二叉樹
概念:
遍歷二叉樹:
遍歷:指按某條搜索路線遍訪每個結點且不重復(又稱周遊)。
遍歷的用途:它是樹結構插入、刪除、修改、查找和排序運算的前提,是二叉樹一切運算的基礎和核心。
時間效率: 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)遍歷二叉樹和線索二叉樹