#include <iostream>
#include <stack>
#include <queue>
using namespace std;
string str;
int index = 0;
struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
/* 按前序输入二叉树中结点的值(一个字符) */
/* #表示空树,构造二叉链表表示二叉树T。 */
typedef char TElemType;
void CreateBiTree(TreeNode* &T) //!一定要传指针或者引用!!!
{
TElemType ch;
/* cin << ch; */ //当程序运行时,用户自行输入
ch = str[index++];
if (ch == '#')
T = nullptr;
else
{
T = new TreeNode(0);
if (!T)
exit(1);
T->val = ch; /* 生成根结点 */
CreateBiTree(T->left); /* 构造左子树 */
CreateBiTree(T->right); /* 构造右子树 */
}
}
//先序遍历
void PreOrderTraverseRecursion(TreeNode* root)
{
if(root == nullptr) return;
cout << root->val << " "; //操作
PreOrderTraverseRecursion(root->left);
PreOrderTraverseRecursion(root->right);
}
void PreOrderTraverseIteration(TreeNode* root)
{
stack<TreeNode*> st;
if(root) st.push(root);
while(!st.empty()){
TreeNode* nd = st.top();
st.pop();
cout << nd->val << " ";
if(nd->right) st.push(nd->right);
if(nd->left) st.push(nd->left);
}
}
//中序遍历
void InOrderTraverseRecursion(TreeNode* root)
{
if(root == nullptr) return;
InOrderTraverseRecursion(root->left);
cout << root->val << " "; //操作
InOrderTraverseRecursion(root->right);
}
void InOrderTraverseIteration(TreeNode* root)
{
stack<TreeNode*> st;
TreeNode* cur = root;
while(cur || !st.empty()){
while(cur){ //可以将此while与外层while合并成一个,效果完全相同,如下
st.push(cur);
cur = cur->left;
}
cur = st.top();
st.pop();
cout << cur->val << " ";
cur = cur->right;
/* if(cur){
st.push(cur);
cur = cur->left;
}else{
cur = st.top();
st.pop();
cout << curr->val << " "; //进行操作
cur = cur->right;
}
*/
}
}
//后续遍历
void PostOrderTraverseRecursion(TreeNode* root)
{
if(root == nullptr) return;
PostOrderTraverseRecursion(root->left);
PostOrderTraverseRecursion(root->right);
cout << root->val << " "; //操作
}
void PostOrderTraverseIteration(TreeNode* root)
{
stack<TreeNode*> st;
if(root) st.push(root);
TreeNode* pre = nullptr;
while(!st.empty()){
TreeNode* nd = st.top();
if(!nd->left && !nd->right || pre && (nd->left == pre || nd->right == pre)) //叶子节点:叶子节点分为两种,一类是原本就是叶子节点的节点;
{ //另一类是父节点的左孩子or右孩子已经出栈,其自身退化成叶节点
st.pop(); //这里的or,逻辑上当父节点同时有左右孩子是表示和
cout << nd->val << " ";
pre = nd;
}else{ //非叶子节点
if(nd->right) st.push(nd->right);
if(nd->left) st.push(nd->left);
}
}
}
//层序遍历
void layerTraverse(TreeNode* root)
{
queue<TreeNode*> q;
if(root) q.push(root);
while(!q.empty()){
TreeNode* front = q.front();
q.pop();
cout << front->val << " ";
if(front->left) q.push(front->left);
if(front->right) q.push(front->right);
}
}
int TreeDepth(TreeNode* root)
{
if(root == nullptr) return 0;
int left = TreeDepth(root->left);
int right = TreeDepth(root->right);
return left>right?left+1 : right+1;
}
int main()
{
TreeNode* root = nullptr;
str = "ABDH#K###E##CFI###G#J##";
CreateBiTree(root);
cout << "二叉树的深度为:" << TreeDepth(root) << endl;
cout << "递归遍历二叉树:" << endl;
cout << "前序遍历二叉树:";
PreOrderTraverseRecursion(root);
cout << "\n中序遍历二叉树:";
InOrderTraverseRecursion(root);
cout << "\n后序遍历二叉树:";
PostOrderTraverseRecursion(root);
cout << "\n\n迭代遍历二叉树:" << endl;
cout << "前序遍历二叉树:";
PreOrderTraverseIteration(root);
cout << "\n中序遍历二叉树:";
InOrderTraverseIteration(root);
cout << "\n后序遍历二叉树:";
PostOrderTraverseIteration(root);
cout << "\n\n层序遍历二叉树:";
layerTraverse(root);
cout << endl;
system("pause");
return 0;
}
二叉树遍历(先序+中序+后序+层序)(迭代+递归、C++实现)
最新推荐文章于 2023-05-08 23:30:40 发布