897-遞增順序查找樹

前言

Weekly Contest 100遞增順序查找樹,題目要求以下:code

給定一個樹, 按順序從新排列樹,使樹中最左邊的結點如今是樹的根,而且每一個結點沒有左子結點,只有一個右子結點。

示例 :遞歸

輸入:[5,3,6,2,4,null,8,1,null,null,null,7,9]

       5
      / \
    3    6
   / \    \
  2   4    8
 /        / \ 
1        7   9

輸出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]

 1
  \
   2
    \
     3
      \
       4
        \
         5
          \
           6
            \
             7
              \
               8
                \
                 9

解題思路

這道題解題步驟以下:leetcode

  1. 找出樹的最左節點:用中序遍歷的方式獲取到樹的最左節點的訪問序列
  2. 根據這個訪問序列生成一個只有右節點的樹便可

PS:我我的是把中序遍歷簡單記作左中右get

實現代碼

/**
  * 遞增順序查找樹
  *
  * @param root
  * @return
  */
 public TreeNode increasingBST(TreeNode root) {
     List<Integer> list = inorderTraversal(root);
     TreeNode result = new TreeNode(list.get(0));
     TreeNode currentNode = result;
     for (int i = 1; i < list.size(); i++) {
         currentNode.right = new TreeNode(list.get(i));
         currentNode = currentNode.right;
     }
     return result;
 }
 
 /**
  * 中序遍歷
  * @param root
  * @return
  */
 private List<Integer> inorderTraversal(TreeNode root) {
     List<Integer> list=new ArrayList<Integer>();
     if(root!=null){
         inorderTraversal(root,list);
     }
     return list;
 }

 /**
  * 中序遍歷時調用的遞歸方法
  * @param root
  * @return
  */
 private void inorderTraversal(TreeNode root,List<Integer> list){
     if(root.left!=null){//遍歷左子樹
         inorderTraversal(root.left,list);
     }
     list.add(root.val);//記錄根節點
     if(root.right!=null){//遍歷右子樹
         inorderTraversal(root.right,list);
     }
 }
相關文章
相關標籤/搜索