小明思考

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

          設置二叉樹的next節點

          Posted on 2013-04-26 11:23 小明 閱讀(2132) 評論(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;
                      }
                  }
              }
          主站蜘蛛池模板: 科尔| 文安县| 青阳县| 大邑县| 威远县| 赤城县| 措美县| 安义县| 禹州市| 洛隆县| 伊春市| 建瓯市| 黄浦区| 邢台市| 读书| 佛坪县| 黄平县| 宝丰县| 阳城县| 微博| 桑植县| 勃利县| 两当县| 上杭县| 福泉市| 中阳县| 石屏县| 阿巴嘎旗| 白河县| 大化| 佛教| 阳城县| 高淳县| 福鼎市| 绵竹市| 喀什市| 彭阳县| 楚雄市| 阆中市| 秭归县| 岳阳县|