二叉树重建
给定两个整数数组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; } }
给定两个整数数组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 2023-04-17 13:46 Andy__Yang 阅读(9) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理