使用前序中序构建二叉树

1. 思路

本题使用递归实现,思路为
f(前,中,prel,prer,midl,midr)
区间形式为[prel,prer)
1.根据前序遍历寻找根节点
2. 在中序遍历中找到根节点的下标 mid
3. 求解 prell(左子树前序序列的左边界) prelr midll midlr prerl prerr midrl midrr
4. node(mid).left=f(前,中, prell prelr midll midlr) node(mid).right=f(前,中, prerl prerr midrl midrr)

2. 易错点

递归终止条件为 左==右,return null,如果写成右-左==1(数组有一个元素),返回 对应的节点,如果递归时该子树只有一个节点,此时可以使用该递归条件,因为在此处终止,就不会出现左==右的情况,如果一开始就是左==右,即[],则会数组越界,0越界空数组

3. 代码

    public TreeNode jbuildTree(int[] preorder, int[] inorder) {
        return buildTreeByDG(preorder,inorder,0,preorder.length,0,inorder.length);
    }
      public TreeNode buildTreeByDG(int[] preorder, int[] inorder,int prel,int prer,int midl,int midr) {
        if(prer-prel==0){
            return null;
        }
        int midvalue=preorder[prel];
        int midIndex = searchIndex(midvalue, inorder, midl, midr);
        int midll=midl,
                midlr=midIndex,
                midrl=midIndex+1,
                midrr=midr,
                prell=prel+1,
                prelr=prell+(midlr-midll),
                prerl=prelr,
                prerr=prer;
        TreeNode root = new TreeNode(midvalue);
        root.left=buildTreeByDG(preorder,inorder,prell,prelr,midll,midlr);
        root.right=buildTreeByDG(preorder,inorder,prerl,prerr,midrl,midrr);
        return root;
    }
    public int searchIndex(int targetValue,int[] inorder, int midl,int midr ){
        for (int i = midl; i <midr ; i++) {
            if (inorder[i]==targetValue){
                return i;
            }
        }
        return -1;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是Python实现二叉树前序中序和后序遍历的示例代码: 1. 前序遍历(Preorder Traversal):根节点 -> 左子树 -> 右子树 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def preorderTraversal(root): if root is None: return [] result = [] result.append(root.val) result += preorderTraversal(root.left) result += preorderTraversal(root.right) return result # 示例用法 # 构建二叉树 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) # 前序遍历 preorder = preorderTraversal(root) print("前序遍历结果:", preorder) ``` 2. 中序遍历(Inorder Traversal):左子树 -> 根节点 -> 右子树 ```python def inorderTraversal(root): if root is None: return [] result = [] result += inorderTraversal(root.left) result.append(root.val) result += inorderTraversal(root.right) return result # 示例用法 # 构建二叉树 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) # 中序遍历 inorder = inorderTraversal(root) print("中序遍历结果:", inorder) ``` 3. 后序遍历(Postorder Traversal):左子树 -> 右子树 -> 根节点 ```python def postorderTraversal(root): if root is None: return [] result = [] result += postorderTraversal(root.left) result += postorderTraversal(root.right) result.append(root.val) return result # 示例用法 # 构建二叉树 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) # 后序遍历 postorder = postorderTraversal(root) print("后序遍历结果:", postorder) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弈师亦友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值