二叉树重建

LeetCode 105.

给定两个整数数组preOrder 和inOrder,其中preOrder是二叉树的先序遍历,inOrder是二叉树的中序遍历,请构造二叉树并返回其根节点

复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
public class Solution {
    Dictionary<int, int> inOrderMap = new Dictionary<int, int>();

    public TreeNode BuildTree(int[] preOrder, int[] inOrder) {
        for (int i = 0; i < inOrder.Length; i++)
            inOrderMap.Add(inOrder[i], i);

        return BuildTreeByRecursion(preOrder, 0, preOrder.Length - 1, inOrder, 0, inOrder.Length - 1);
    }

    public TreeNode BuildTreeByRecursion(int[] preOrder, int preStart, int preEnd, int[] inOrder, int inStart, int inEnd)
    {
//先序遍历的第一个节点一定是当前子树的根节点
int rootValue = preOrder[preStart]; int rootInOrderIndex = inOrderMap[rootValue]; TreeNode root = new TreeNode(rootValue);
     //当前子树左孩子节点数
int leftNodes = rootInOrderIndex - inStart;
     //当前子树右孩子节点数
     int rightNodes = inEnd - rootInOrderIndex; if (leftNodes > 0) root.left = BuildTreeByRecursion(preOrder, preStart + 1, preStart + leftNodes, inOrder, inStart, rootInOrderIndex - 1); if (rightNodes > 0) root.right = BuildTreeByRecursion(preOrder, preStart + leftNodes + 1, preEnd, inOrder, rootInOrderIndex + 1, inEnd); return root; } }
复制代码

 LeetCode 106.

给定两个整数数组inOrder 和postOrder,其中inOrder是二叉树的中序遍历,postOrder是二叉树的后序遍历,请构造二叉树并返回其根节点

复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
public class Solution {
    Dictionary<int, int> inOrderMap = new Dictionary<int, int>();

    public TreeNode BuildTree(int[] inOrder, int[] postOrder) {
        for (int i = 0; i < inOrder.Length; i++)
            inOrderMap.Add(inOrder[i], i);

        return BuildTreeByRecursion(inOrder, 0, inOrder.Length - 1, postOrder, 0, postOrder.Length - 1);
    }

    public TreeNode BuildTreeByRecursion(int[] inOrder, int inStart, int inEnd, int[] postOrder, int postStart, int postEnd)
    {
     //后续遍历的最后一个节点一定是当前子树的根节点
int rootValue = postOrder[postEnd]; int rootInOrderIndex = inOrderMap[rootValue]; TreeNode root = new TreeNode(rootValue); int leftNodes = rootInOrderIndex - inStart; int rightNodes = inEnd - rootInOrderIndex; if (leftNodes > 0) root.left = BuildTreeByRecursion(inOrder, inStart, rootInOrderIndex - 1, postOrder, postStart, postStart + leftNodes - 1); if (rightNodes > 0) root.right = BuildTreeByRecursion(inOrder, rootInOrderIndex + 1, inEnd, postOrder, postEnd - rightNodes, postEnd - 1); return root; } }
复制代码

 

posted on   Andy__Yang  阅读(9)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示