LeetCode.897-遞增搜索樹(Increasing Order Search Tree)

這是悅樂書的第346次更新,第370篇原創

java

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第211題(順位題號是897)。給定一棵樹,按中序遍歷順序從新排列樹,以便樹中最左邊的節點如今是樹的根,而且每一個節點都沒有左子節點,只有一個右子節點。例如:
輸入:[5,3,6,2,4,null,8,1,null,null,null,7,9]node

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

注意數據結構

  • 給定樹中的節點數將介於1和100之間。code

  • 每一個節點都有一個0到1000的惟一整數值。

    遞歸

02 第一種解法

先對原二叉樹經過遞歸的方式進行中序遍歷,將全部的節點值存入一個List中,以List中的第一個元素做爲根節點,再遍歷List中剩下的其餘元素,做爲樹的右子節點,最後返回新樹。get

public TreeNode increasingBST(TreeNode root) {
    List<Integer> list = new ArrayList<Integer>();
    inorder(root, list);
    TreeNode result = new TreeNode(list.get(0));
    TreeNode ans = result;
    for (int i=1; i<list.size(); i++) {
        ans.right = new TreeNode(list.get(i));
        ans = ans.right;
    }
    return result;
}

public void inorder(TreeNode node, List<Integer> list){
    if (node == null) {
        return ;
    }    
    inorder(node.left, list);
    list.add(node.val);
    inorder(node.right, list);
}


03 第二種解法

思路和第一種解法同樣,只是將中序遍歷二叉樹從遞歸換成了迭代。class

public TreeNode increasingBST2(TreeNode root) {
    List<Integer> list = new ArrayList<Integer>();
    Stack<TreeNode> stack = new Stack<TreeNode>();
    while (root != null || !stack.isEmpty()) {
        while (root != null) {
            stack.push(root);
            root = root.left;
        }
        if (!stack.isEmpty()) {
            root = stack.pop();
            list.add(root.val);
            root = root.right;
        }
    }
    TreeNode result = new TreeNode(list.get(0));
    TreeNode ans = result;
    for (int i=1; i<list.size(); i++) {
        ans.right = new TreeNode(list.get(i));
        ans = ans.right;
    }
    return result;
}


04 第三種解法

咱們還能夠再簡化下,不使用List來存儲原二叉樹的節點值,直接將獲得的節點值做爲新二叉樹的節點值便可。數據結構與算法

public TreeNode increasingBST3(TreeNode root) {
    TreeNode result = new TreeNode(0);
    TreeNode ans = result;
    Stack<TreeNode> stack = new Stack<TreeNode>();
    while (root != null || !stack.isEmpty()) {
        while (root != null) {
            stack.push(root);
            root = root.left;
        }
        if (!stack.isEmpty()) {
            root = stack.pop();
            // 直接處理節點,做爲新樹的右子節點
            ans.right = new TreeNode(root.val);
            ans = ans.right;
            root = root.right;
        }
    }
    return result.right;
}


05 第四種解法

針對上面的第三種解法,咱們也可使用遞歸來解。List

TreeNode ans;
public TreeNode increasingBST4(TreeNode root) {
    TreeNode result = new TreeNode(0);
    ans = result;
    helper(root);
    return result.right;
}

public void helper(TreeNode root) {
    if (root == null) {
        return ;
    }
    helper(root.left);
    ans.right = new TreeNode(root.val);
    ans = ans.right;
    helper(root.right);
}


06 小結

算法專題目前已連續日更超過六個月,算法題文章214+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

相關文章
相關標籤/搜索