這是悅樂書的第346次更新,第370篇原創
java
今天介紹的是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的惟一整數值。
遞歸
先對原二叉樹經過遞歸的方式進行中序遍歷,將全部的節點值存入一個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); }
思路和第一種解法同樣,只是將中序遍歷二叉樹從遞歸換成了迭代。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; }
咱們還能夠再簡化下,不使用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; }
針對上面的第三種解法,咱們也可使用遞歸來解。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); }
算法專題目前已連續日更超過六個月,算法題文章214+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!