遍歷二叉樹的各種操作(非遞迴遍歷) 轉載自:hackbuteer1 前輩
阿新 • • 發佈:2019-01-22
在網上看了很多的人寫的二叉樹的非遞迴的遍歷,但是能執行的正確的並不多。感謝hackbuteer1 前輩 寫出了這樣清晰和完美的程式碼。
特轉載和保存於此。
先使用先序的方法建立一棵二叉樹,然後分別使用遞迴與非遞迴的方法實現前序、中序、後序遍歷二叉樹,並使用了兩種方法來進行層次遍歷二叉樹,一種方法就是使用STL中的queue,另外一種方法就是定義了一個數組佇列,分別使用了front和rear兩個陣列的下標來表示入隊與出隊,還有兩個操作就是求二叉樹的深度、結點數。。。
-
//轉載請標明出處,原文地址:http://blog.csdn.net/hackbuteer1/article/details/6583988
- #include<iostream>
- #include<queue>
- #include<stack>
- usingnamespace std;
- //二叉樹結點的描述
- typedefstruct BiTNode
- {
- char data;
- struct BiTNode *lchild, *rchild; //左右孩子
- }BiTNode,*BiTree;
- //按先序遍歷建立二叉樹
- //BiTree *CreateBiTree() //返回結點指標型別
-
//void CreateBiTree(BiTree &root) //引用型別的引數
- void CreateBiTree(BiTNode **root) //二級指標作為函式引數
- {
- char ch; //要插入的資料
- scanf("\n%c", &ch);
- //cin>>ch;
- if(ch=='#')
- *root = NULL;
- else
- {
- *root = (BiTNode *)malloc(sizeof(BiTNode));
- (*root)->data = ch;
-
printf("請輸入%c的左孩子:"
- CreateBiTree(&((*root)->lchild));
- printf("請輸入%c的右孩子:",ch);
- CreateBiTree(&((*root)->rchild));
- }
- }
- //前序遍歷的演算法程式
- void PreOrder(BiTNode *root)
- {
- if(root==NULL)
- return ;
- printf("%c ", root->data); //輸出資料
- PreOrder(root->lchild); //遞迴呼叫,前序遍歷左子樹
- PreOrder(root->rchild); //遞迴呼叫,前序遍歷右子樹
- }
- //中序遍歷的演算法程式
- void InOrder(BiTNode *root)
- {
- if(root==NULL)
- return ;
- InOrder(root->lchild); //遞迴呼叫,前序遍歷左子樹
- printf("%c ", root->data); //輸出資料
- InOrder(root->rchild); //遞迴呼叫,前序遍歷右子樹
- }
- //後序遍歷的演算法程式
- void PostOrder(BiTNode *root)
- {
- if(root==NULL)
- return ;
- PostOrder(root->lchild); //遞迴呼叫,前序遍歷左子樹
- PostOrder(root->rchild); //遞迴呼叫,前序遍歷右子樹
- printf("%c ", root->data); //輸出資料
- }
- /*
- 二叉樹的非遞迴前序遍歷,前序遍歷思想:先讓根進棧,只要棧不為空,就可以做彈出操作,
- 每次彈出一個結點,記得把它的左右結點都進棧,記得右子樹先進棧,這樣可以保證右子樹在棧中總處於左子樹的下面。
- */
- void PreOrder_Nonrecursive(BiTree T) //先序遍歷的非遞迴
- {
- if(!T)
- return ;
- stack<BiTree> s;
- s.push(T);
- while(!s.empty())
- {
- BiTree temp = s.top();
- cout<<temp->data<<" ";
- s.pop();
- if(temp->rchild)
- s.push(temp->rchild);
- if(temp->lchild)
- s.push(temp->lchild);
- }
- }
- void PreOrder_Nonrecursive1(BiTree T) //先序遍歷的非遞迴
- {
- if(!T)
- return ;
- stack<BiTree> s;
- BiTree curr = T;
- while(curr != NULL || !s.empty())
- {
- while(curr != NULL)
- {
- cout<<curr->data<<" ";
- s.push(curr);
- curr = curr->lchild;
- }
- if(!s.empty())
- {
- curr = s.top();
- s.pop();
- curr = curr->rchild;
- }
- }
- }
- void PreOrder_Nonrecursive2(BiTree T) //先序遍歷的非遞迴
- {
- if(!T)
- return ;
- stack<BiTree> s;
- while(T) // 左子樹上的節點全部壓入到棧中
- {
- s.push(T);
- cout<<T->data<<" ";
- T = T->lchild;
- }
- while(!s.empty())
- {
- BiTree temp = s.top()->rchild; // 棧頂元素的右子樹
- s.pop(); // 彈出棧頂元素
- while(temp) // 棧頂元素存在右子樹,則對右子樹同樣遍歷到最下方
- {
- cout<<temp->data<<" ";
- s.push(temp);
- temp = temp->lchild;
- }
- }
- }