原文地址:http://blog.csdn.net/forbes_zhong/article/details/51227747
利用栈实现二叉树的非递归遍历,并求二叉树的深度、叶子节点数、两个节点的最近公共祖先以及二叉树结点的最大距离,部分参考《剑指offer》这本书,其代码如下:
- #include<iostream>
- #include<vector>
- #include<stack>
- using namespace std;
- typedef struct BiNode //定义一棵二叉树
- {
- char val;
- struct BiNode *left;
- struct BiNode *right;
- BiNode(char x) :val(x), left(NULL), right(NULL){}
- }BiNode,*BiTree;
- void CreateBiTree(BiTree &T)//前序创建一颗二叉树
- {
- char c;
- cin >> c;
- if ('#' == c)
- T=NULL;
- else
- {
- T = (BiNode* ) malloc(sizeof(BiNode));
- T->val = c;
- CreateBiTree(T->left);
- CreateBiTree(T->right);
- }
- }
- //二叉树的非递归遍历(前序、中序、后序及层序)
- void PreOrder(BiTree& T)//前序遍历,非递归
- {
- if (T == NULL)
- return;
- vector<BiNode*> S;
- BiNode *p = T;
- while (p != NULL || !S.empty())
- {
- while (p != NULL)
- {
- cout << p->val << " ";
- S.push_back(p);
- p = p->left;
- }
- if (!S.empty())
- {
- p = S[S.size() - 1];
- S.pop_back();
- p = p->right;
- }
- }
- cout << endl;
- }
- void InOrder(BiTree& T)//中序遍历,非递归
- {
- if (T == NULL)
- return;
- vector<BiNode*> S;
- BiNode *p = T;
- while ( p != NULL || !S.empty())
- {
- while (p != NULL)
- {
- S.push_back(p);
- p = p->left;
- }
- if (!S.empty())
- {
- p = S[S.size() - 1];
- cout << p->val << " ";
- S.pop_back();
- p = p->right;
- }
- }
- cout << endl;
- }
- void PostOrder(BiTree &T)//后序遍历(双栈法),非递归
- {
- if (T == NULL)
- return;
- vector<BiNode*> S1,S2;
- BiNode *p ;//当前指针所在结点
- S1.push_back(T);
- while (!S1.empty())
- {
- p = S1[S1.size() - 1];
- S1.pop_back();
- S2.push_back(p);
- if (p->left)
- S1.push_back(p->left);
- if (p->right)
- S1.push_back(p->right);
- }
- while (!S2.empty())
- {
- cout << S2[S2.size() - 1]->val << " ";
- S2.pop_back();
- }
- cout << endl;
- }
- void LevelOrder(BiTree &T)//非递归层序遍历,可选择按层输出结点,也可用于计算二叉树的深度
- {
- if (T == NULL)
- return;
- vector<BiNode*> S;
- S.push_back(T);
- //int depth = 0;//统计二叉树的深度
- int cur = 0;
- int last = 1;
- while (cur < S.size())
- {
- last = S.size();
- while (cur < last)
- {
- cout << S[cur]->val << " ";
- if (S[cur]->left != NULL)
- S.push_back(S[cur]->left);
- if (S[cur]->right != NULL)
- S.push_back(S[cur]->right);
- ++cur;
- }
- //cout << endl;如果需要按层输出每一层的结点则取消此行注释
- //depth++;//如果要求二叉树的深度,只需在此统计输出了多少次endl就可以
- }
- cout << endl;
- }
- void LevelOrder2(BiTree &T)//层序遍历,非递归(双栈法),奇偶层数存储有区别时可实现之字形打印
- {
- if (T == NULL)
- return;
- stack<BiNode*> Levels[2];
- int cur = 0;//奇数行
- int next = 1;//偶数行
- Levels[cur].push(T);
- while (!Levels[0].empty() || !Levels[1].empty())
- {
- BiNode *p = Levels[cur].top();
- Levels[cur].pop();
- cout << p->val << " ";
- if (cur == 0)//奇数层顺序存储
- {
- if (p->left != NULL)
- Levels[next].push(p->left);
- if (p->right != NULL)
- Levels[next].push(p->right);
- }
- else//偶数层逆序存储
- {
- if (p->right != NULL)
- Levels[next].push(p->right);
- if (p->left != NULL)
- Levels[next].push(p->left);
- }
- if (Levels[cur].empty())
- {
- //cout << endl;//换行,如果不换行可以注释掉这条
- cur = 1 - cur;
- next = 1 - next;
- }
- }
- cout << endl;
- }
- void GetNodePath(BiNode* T, BiNode* Node, vector<BiNode*>& Path,int &found)//获取二叉树中从根节点到指定节点的路径
- {
- if (T == NULL)
- return;
- Path.push_back(T);
- if (T == Node)
- found = 1;
- if (!found)
- {
- GetNodePath(T->left, Node, Path, found);
- }
- if (!found)
- {
- GetNodePath(T->right, Node, Path, found);
- }
- if (!found)
- Path.pop_back();
- else
- return;
- }
- BiNode* GetLastCommonNode(const vector<BiNode*> Path1, const vector<BiNode*> Path2)//获取两条路径的最后一个共同节点
- { </span