小明思考

          Just a software engineer
          posts - 124, comments - 36, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          設置二叉樹的next節點

          Posted on 2013-04-26 11:23 小明 閱讀(2130) 評論(0)  編輯  收藏 所屬分類: 數據結構和算法
          問題給定一顆二叉樹:
          class TreeLinkNode {
            TreeLinkNode left;
            TreeLinkNode right;
            TreeLinkNode next;
          }
          要求把所有節點的next節點設置成它右邊的節點,如果沒有右節點,設置成空。初始狀態,所有的next的指針均為null.

          要求:你只能使用常數的空間。

          比如:
                   1
                 /  \
                2    3
               / \    \
              4   5    7
          應該輸出:

          1 -> NULL
                 /  \
                2 -> 3 -> NULL
               / \    \
              4-> 5 -> 7 -> NULL

          分析:
          題目不難,但是在面試時,在有限的時間內,沒有bug寫出,還是很考驗功力的。

          解決這個問題的思路是逐層掃描,上一層設置好下一層的next關系,在處理空指針的時候要格外小心。
          代碼如下,有注釋,應該很容易看懂:
          使用了三個指針:
          node:當前節點
          firstChild:下一層的第一個非空子節點
          lastChild:下一層的最后一個待處理(未設置next)的子節點

              public void connect(TreeLinkNode root) {
                  TreeLinkNode node = root;
                  TreeLinkNode firstChild = null;
                  TreeLinkNode lastChild = null;
                  
                  while(node!=null){
                      if(firstChild == null){ //記錄第一個非空子節點
                          firstChild = node.left!=null?node.left:node.right;
                      }
                      //設置子節點的next關系,3種情況
                      if(node.left!=null && node.right!=null){ 
                          if(lastChild!=null){
                              lastChild.next = node.left;
                          }
                          node.left.next = node.right;
                          lastChild = node.right;
                      }
                      else if(node.left!=null){
                          if(lastChild!=null){
                              lastChild.next = node.left;
                          }
                          lastChild = node.left;
                      }
                      else if(node.right!=null){
                          if(lastChild!=null){
                              lastChild.next = node.right;
                          }
                          lastChild = node.right;
                      }
                      //設置下一個節點,如果本層已經遍歷完畢,移到下一層的第一個子節點
                      if(node.next!=null){
                          node = node.next;
                      }
                      else{
                          node = firstChild;
                          firstChild = null;
                          lastChild = null;
                      }
                  }
              }
          主站蜘蛛池模板: 仁寿县| 汉源县| 六盘水市| 土默特右旗| 东方市| 石楼县| 莱西市| 曲水县| 舒城县| 横峰县| 吴堡县| 阿瓦提县| 平潭县| 丰镇市| 东宁县| 巴彦县| 平阴县| 东辽县| 梨树县| 高阳县| 和平区| 山阳县| 苗栗县| 江安县| 白玉县| 绍兴市| 景泰县| 安多县| 桑植县| 基隆市| 潜江市| 奉化市| 六盘水市| 克什克腾旗| 西丰县| 黔江区| 屯门区| 洛阳市| 福泉市| 巴塘县| 从江县|