標籤:style class blog code http color
中序遍曆思想
若二叉樹為空白,則結束遍曆操作;否則中序遍曆根節點的左子樹;訪問根節點;中序遍曆右子樹;
實現代碼:
//中序遍曆代碼template<typename T>void BinaryTree<T>::InTraBiTree(BTNode<T> *p){ if(p) { InTraBiTree(p->lchild); cout<<p->data<<" "; InTraBiTree(p->rchild); }}
下面是虛擬碼類比電腦步驟協助理解。
假設有這樣一個簡單二叉樹
虛擬碼類比電腦步驟如下:
InTraBiTree(a){ if(a) { InTraBiTree(b)//a左為b,不為空白 { if(b) { InTraBiTree(b左子)//b左子為空白,直接執行下一步 { if(NULL){}; } cout<<b; InTraBiTree(c)//b右子為c { if(c) { InTraBiTree(c左子)//c左子為空白,直接執行下一步 cout<<c; InTraBiTree(c右子)//c右子為空白,直接執行下一步 } }//end c c層執行結束,跳到b層 } }//end b b層結束跳到a層 cout<<a; InTraBiTree(d)//a右為d { if(d) { InTraBiTree(d左子)//d左子為空白,直接執行下一步 cout<<d InTraBiTree(d右子)//d右子為空白,直接執行下一步 } } }}
下面是完全實現代碼(C++版),可以測試下
template<typename T>struct BTNode{ T data; BTNode<T> *lchild; BTNode<T> *rchild;};template<typename T>class BinaryTree{private: BTNode<T> *BT;public: BinaryTree(){BT=NULL;}//建構函式,構造根節點並將根節點置空 void CreateBiTree(T end);//建立結束標誌位end的二叉樹 BTNode<T> * GetRoot();//返回根地址 void InTraBiTree(BTNode<T> *p);//中序遍曆二叉樹};void BinaryTree<T>::CreateBiTree(T end){ cout<<"輸入二叉樹,以"<<end<<"為空白指標域的標誌:"<<endl; BTNode<T> *p; T x; cin>>x; if(x==end) return; p=new BTNode<T>; p->data=x; p->lchild=NULL; p->rchild=NULL; BT=p; create(p,1,end); create(p,2,end);}template<typename T>static int create(BTNode<T> *p,int k,int end){ BTNode<T> *q; T x; cin>>x; if(x!=end) { q=new BTNode<T>; q->data=x; q->lchild=NULL; q->rchild=NULL; if(k==1) p->lchild=q; if(k==2) p->rchild=q; create(q,1,end); create(q,2,end); } return 0;}template<typename T>BTNode<T> * BinaryTree<T>::GetRoot(){ return BT;}template<typename T>void BinaryTree<T>::InTraBiTree(BTNode<T> *p){ if(p) { InTraBiTree(p->lchild); cout<<p->data<<" "; InTraBiTree(p->rchild); }}#include<iostream>using namespace std;#include"BinaryTree.h";int main(void){ BinaryTree<char> b;//構造二叉樹對象,僅有一個b 指標指向NULL char end=‘#‘; b.CreateBiTree(end);//建立二叉樹,以#為結束標誌 getchar(); cout<<"中序遍曆二叉樹:"; b.InTraBiTree(b.GetRoot()); cout<<endl; getchar();}