897——Increasing Order SearchTree
阿新 • • 發佈:2018-12-26
題目
Given a tree, rearrange the tree in in-order so that the leftmost node in the tree is now the root of the tree, and every node has no left child and only 1 right child.
大意
給出一個樹,重新排列,使得最左的節點是樹的根節點,並且每個節點只有一個右孩子而沒有左孩子。
樣例
Example 1: Input: [5,3,6,2,4,null,8,1,null,null,null,7,9] 5 / \ 3 6 / \ \ 2 4 8 / / \ 1 7 9 Output:[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
思路
一、可以觀察到,排列之後的樹從左上到右下遍歷剛好與排列之前的中序遍歷得到的序列一模一樣,所以中序遍歷未排列的,用一個vector儲存,再用這個vector構造樹。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void inorder(TreeNode *root,vector<int> &result) { if(!root)return; inorder(root->left,result); result.push_back(root->val); inorder(root->right,result); } TreeNode* increasingBST(TreeNode* root) { vector<int>result; inorder(root,result); TreeNode *ans=new TreeNode(0);TreeNode *cur=ans; for(int i=0;i<result.size();i++) { ans->right=new TreeNode(result[i]); ans=ans->right; } return cur->right; } };
需要注意的是,inorder中序遍歷函式中的vector引數需要為引用引數,並且,在重新排列的過程中,需要用cur儲存第一次構建的樹,然後像連結串列一樣構造它的子樹,如果不使用cur,最後得到的ans是葉節點而不是根。
二、leetcode的最優解,看的不太懂。。。。大致是把一個樹調整一下,將左葉節點作為根節點,根節點作為左葉節點的右節點,右節點作為葉節點。遞迴呼叫
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *curr;
void traversal(TreeNode *root) {
if(!root) return;
traversal(root->right);
root->right = curr;
curr = root;
traversal(root->left);
root->left = nullptr;
}
TreeNode* increasingBST(TreeNode* root) {
traversal(root);
return curr;
}
};