劍指offer_7_重建二叉樹

  • 2019 年 10 月 7 日
  • 筆記

題目:重建二叉樹

描述:

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重新構建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中不包含重複的數字。例如輸入的前序遍歷序列為{5,2,1,7,6,9}和中序遍歷為{1,2,5,6,7,9},則重建出二叉樹並輸出它的頭結點。

思路:利用前序遍歷根節點左右倆側是左右子樹,中序遍歷第一個節點就根節點的特性,將一棵樹細分成很多子樹,從根節點往下構造。

Map<Integer,Integer> map = new HashMap<>();    public TreeNode fill(int[] pre,int[] in) {      for (int i = 0; i < in.length; i++) {          map.put(in[i],i);      }      return reBuild(pre,0,pre.length -1,0);  }      // pre[] 前序遍歷 preL:當前前序遍曆數組的最左側 preR:當前前序遍曆數組的最右側 inL中序遍歷的最左側  public TreeNode reBuild(int[] pre,int preL,int preR,int inL) {       if (preL > preR) {           return null;       }      TreeNode root = new TreeNode(pre[preL]);       // 得到該節點的下標       int inIndex = map.get(root.value);       // 左子樹的大小       int lTreeSize = inIndex - inL;       // 遞歸左邊的子樹       root.left = reBuild(pre,preL + 1,preL + lTreeSize,inL);       // 遞歸右邊的子樹 inL + lTreeSize + 1:當前中序遍曆數組的最左側元素       root.right = reBuild(pre,preL + lTreeSize + 1,preR,inL + lTreeSize + 1);      return root;   }  }    class TreeNode {      TreeNode left;      TreeNode right;      int value;      public TreeNode(int value) {          this.value = value;      }  }

利用前序後續遍歷的特性,重新構建二叉樹。