-
题目:
给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。 -
解题思路
方法一:
将中序遍历的节点的值递归存储入数组中,再只用将这些节点链接成一个只有右孩子的单支树
代码实现:
vector<int> res;
vector<int> mid(TreeNode* root)
{
if(!root)
return res;
else
{
mid(root->left);
res.push_back(root->val);
mid(root->right);
}
return res;
}
TreeNode* increasingBST(TreeNode* root) {
vector<int> res1 = mid(root);
TreeNode* root1 = new TreeNode(res[0]);
TreeNode* p = root1;
for(int i = 1; i < res.size() ; i++)
{
TreeNode* temp_node = new TreeNode(res[i]);
p->right = temp_node;
p = temp_node;
}
return root1;
}
方法二:
在二叉树中序非递归遍历的基础上进行修改即可。
代码实现
TreeNode* increasingBST(TreeNode* root) {
stack<TreeNode*> T;
vector<int> list;
TreeNode* cur = root;
TreeNode* head = nullptr, *p = head;
while(cur || !T.empty())
{
while(cur) {
T.push(cur);
cur = cur->left;
}
if(!T.empty()) {
cur = T.top();
T.pop();
if(!head) {
p = new TreeNode(cur->val);
head = p;
} else {
TreeNode* temp_node = new TreeNode(cur->val);
p->right = temp_node;
p = temp_node;
}
cur = cur->right;
}
}
return head;
}