讲解前序中序建立二叉树

1 篇文章 0 订阅
1 篇文章 0 订阅

vector版:直接上c++代码,讲解在下面,一定要看哦!

struct node{
    node *l, *r;
    int val;
    node(int x) : val(x), l(NULL), r(NULL) {}
};
node* reBuild(vector<int> pre, vector<int> in){
    vector<int> lPre, rPre, lIn, rIn;
    int pos = 0;
    int len = in.size();
    if(len == 0)
        return NULL;
    node* cur = new node(pre[0]);
    for(int i = 0; i < len; i++){
        if(pre[0] == in[i]){
            pos = i;
            break;
        }
    }
    for(int i = 1; i < pos+1; i++){
        lPre.push_back(pre[i]);
        lIn.push_back(in[i-1]);
    }
    for(int i = pos+1; i < len; i++){
        rPre.push_back(pre[i]);
        rIn.push_back(in[i]);
    }
    cur->l = reBuild(lPre, lIn);
    cur->r = reBuild(rPre, rIn);
    return cur;
}

一定不要死记硬背,跟随我的思路来理解:
第一步,因为我们要建树,所以函数的范围值是一个节点指针。
第二步,因为模拟手动建树,需要的参数就是前序遍历和中序遍历的序列,所以参数是pre,in。
第三步,根据分治法原理,递归地去建立当前节点的左子树和右子树,此处就是递归的入口(两个)。
第四步,设定递归出口,当前序或者中序遍历的长度为0时,返回。

共勉:做题先想思路,后想实现方法,不可一起考虑!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来解答你的问题。 假设我们有如下的二叉树: ``` 1 / \ 2 3 / \ / \ 4 5 6 7 ``` 它的前序遍历是:1 2 4 5 3 6 7 它的中序遍历是:4 2 5 1 6 3 7 它的后序遍历是:4 5 2 6 7 3 1 现在我们来讲解如何输出前序中序和后序遍历。 ### 前序遍历 前序遍历的顺序是先遍历根节点,再遍历左子树,最后遍历右子树。可以使用递归算法或栈辅助遍历。 递归算法: ```java public void preorderTraversal(TreeNode root) { if (root == null) { return; } System.out.print(root.val + " "); preorderTraversal(root.left); preorderTraversal(root.right); } ``` 栈辅助遍历: ```java public void preorderTraversal(TreeNode root) { if (root == null) { return; } Stack<TreeNode> stack = new Stack<>(); stack.push(root); while (!stack.isEmpty()) { TreeNode node = stack.pop(); System.out.print(node.val + " "); if (node.right != null) { stack.push(node.right); } if (node.left != null) { stack.push(node.left); } } } ``` ### 中序遍历 中序遍历的顺序是先遍历左子树,再遍历根节点,最后遍历右子树。同样可以使用递归算法或栈辅助遍历。 递归算法: ```java public void inorderTraversal(TreeNode root) { if (root == null) { return; } inorderTraversal(root.left); System.out.print(root.val + " "); inorderTraversal(root.right); } ``` 栈辅助遍历: ```java public void inorderTraversal(TreeNode root) { if (root == null) { return; } Stack<TreeNode> stack = new Stack<>(); TreeNode node = root; while (node != null || !stack.isEmpty()) { while (node != null) { stack.push(node); node = node.left; } node = stack.pop(); System.out.print(node.val + " "); node = node.right; } } ``` ### 后序遍历 后序遍历的顺序是先遍历左子树,再遍历右子树,最后遍历根节点。同样可以使用递归算法或栈辅助遍历。 递归算法: ```java public void postorderTraversal(TreeNode root) { if (root == null) { return; } postorderTraversal(root.left); postorderTraversal(root.right); System.out.print(root.val + " "); } ``` 栈辅助遍历: ```java public void postorderTraversal(TreeNode root) { if (root == null) { return; } Stack<TreeNode> stack1 = new Stack<>(); Stack<TreeNode> stack2 = new Stack<>(); stack1.push(root); while (!stack1.isEmpty()) { TreeNode node = stack1.pop(); stack2.push(node); if (node.left != null) { stack1.push(node.left); } if (node.right != null) { stack1.push(node.right); } } while (!stack2.isEmpty()) { System.out.print(stack2.pop().val + " "); } } ``` 希望以上讲解能够帮助你理解如何输出前序中序和后序遍历的二叉树

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值