二叉树遍历 (递归) 前序+中序转后序,简单易懂

#include<iostream>
#include<algorithm>
using namespace std;
void Post(string str1,string str2)
{
    if(str1.length()==0)    return;
    int root=str2.find(str1[0]);//前序第一个是根
    Post(str1.substr(1,root),str2.substr(0,root));//根的左子树
    Post(str1.substr(root+1),str2.substr(root+1));//根的右子树
    cout<<str1[0];//后序递归
}
int main()
{
    string str1,str2;
    while(cin>>str1>>str2)
    {
        Post(str1,str2);//前序+中序转后序
        cout<<endl;

    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树的遍方式有四种:、后和层次遍。下面分别介绍这四种遍方式的算法思想和实现方法: 1. 的算法思想是先访问根节点,然后按照左子树、右子树的顺归遍每个子树。具体实现过程可以采用归方式或者利用栈来实现迭代遍归方式实现: ``` void preOrderTraversal(TreeNode* root) { if (root != NULL) { cout << root->val << " "; //访问根节点 preOrderTraversal(root->left); //归遍左子树 preOrderTraversal(root->right); //归遍右子树 } } ``` 利用栈实现: ``` void preOrderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> st; st.push(root); while (!st.empty()) { TreeNode* node = st.top(); st.pop(); cout << node->val << " "; //访问当节点 if (node->right != NULL) st.push(node->right); //右子树入栈 if (node->left != NULL) st.push(node->left); //左子树入栈 } } ``` 2. 的算法思想是先归遍左子树,然后访问根节点,最后归遍右子树。具体实现过程可以采用归方式或者利用栈来实现迭代遍归方式实现: ``` void inOrderTraversal(TreeNode* root) { if (root != NULL) { inOrderTraversal(root->left); //归遍左子树 cout << root->val << " "; //访问根节点 inOrderTraversal(root->right); //归遍右子树 } } ``` 利用栈实现: ``` void inOrderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> st; TreeNode* node = root; while (node != NULL || !st.empty()) { while (node != NULL) { st.push(node); node = node->left; } node = st.top(); st.pop(); cout << node->val << " "; //访问当节点 node = node->right; } } ``` 3. 后的算法思想是先归遍左子树,然后归遍右子树,最后访问根节点。具体实现过程可以采用归方式或者利用栈来实现迭代遍归方式实现后: ``` void postOrderTraversal(TreeNode* root) { if (root != NULL) { postOrderTraversal(root->left); //归遍左子树 postOrderTraversal(root->right); //归遍右子树 cout << root->val << " "; //访问根节点 } } ``` 利用栈实现后: ``` void postOrderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> st; TreeNode* node = root; TreeNode* lastVisit = NULL; while (node != NULL || !st.empty()) { while (node != NULL) { st.push(node); node = node->left; } node = st.top(); if (node->right == NULL || node->right == lastVisit) { st.pop(); cout << node->val << " "; //访问当节点 lastVisit = node; node = NULL; } else { node = node->right; } } } ``` 4. 层次遍 层次遍的算法思想是按照从上到下、从左到右的顺依次访问每个节点。具体实现过程可以采用队列来实现。 ``` void levelOrderTraversal(TreeNode* root) { if (root == NULL) return; queue<TreeNode*> q; q.push(root); while (!q.empty()) { int size = q.size(); for (int i = 0; i < size; i++) { TreeNode* node = q.front(); q.pop(); cout << node->val << " "; //访问当节点 if (node->left != NULL) q.push(node->left); //左子树入队 if (node->right != NULL) q.push(node->right); //右子树入队 } } } ``` 以上是二叉树实现、后、层次遍的算法思想和实现方法。其归方式实现简单易懂,但可能会导致归调用栈溢出的问题;利用栈或队列实现的迭代遍方式更加稳定,但需要额外的空间来存储栈或队列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值