二叉樹的重建
阿新 • • 發佈:2017-09-08
二叉樹的重建
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } /** * 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。 * 假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。 * 例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}, * 則重建二叉樹並返回。 * @author user * * *思路:前序遍歷的第一個數據即為根節點的數據,則在中序遍歷中進行掃描去找到根節點所在的位置,那麽 *根據中序遍歷的特點,根節點之前即為樹的左子樹,之後即為右子樹。同樣前序遍歷中根節點之後分別為左子樹和右子樹, *那麽就可以找到左子樹和右子樹根節點。此時就可以使用遞歸了 */ public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { //根節點 TreeNode rootNode = new TreeNode(pre[0]); //判斷前序遍歷的長度 if(pre.length == 1) { //沒有子樹 rootNode.left = null; rootNode.right = null; return rootNode; } //獲取根節點值,即前序遍歷的第一個 int rootNodeVal = pre[0]; //在中序遍歷中查找根節點的位置 int j; for (j = 0; j < in.length; j++) { if(in[j] == rootNodeVal) break; } //構建左子樹 if(j > 0) { //判斷是不是沒有左子樹 int[] preo = new int[j]; int[] ino = new int[j]; //獲得左子樹的前序遍歷 for (int i = 0; i < j; i++) { preo[i] = pre[i+1]; } //獲得左子樹的中序遍歷 for (int i = 0; i < j; i++) { ino[i] = in[i]; } //遞歸 rootNode.left = reConstructBinaryTree(preo, ino); } else { rootNode.left = null; } //構建右子樹 if(pre.length - j - 1 > 0) { //判斷是不是沒有右子樹 int[] preo = new int[pre.length - j - 1]; int[] ino = new int[pre.length - j - 1]; //獲取右子樹的前序遍歷和中序遍歷 for(int i = j + 1; i < pre.length; i++) { preo[i - j -1] = pre[i]; ino[i - j -1] = in[i]; } //遞歸 rootNode.right = reConstructBinaryTree(preo, ino); } else { rootNode.right = null; } return rootNode; } }
本文出自 “12212886” 博客,請務必保留此出處http://12222886.blog.51cto.com/12212886/1963601
二叉樹的重建