leetcode897.递增顺序查找树

自古美人都是妖i 提交于 2020-01-20 16:56:15

题目描述

给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。

提示:

  1. 给定树中的结点数介于 1 和 100 之间。
  2. 每个结点都有一个从 0 到 1000 范围内的唯一整数值。

解法1:中序遍历再重建树

先按照中序遍历存储节点(较简单),再按照题目要求重新建树。

代码如下:

class Solution {
public:
    void getVec(TreeNode* root, vector<int>& nodes) 
    {
        if(root == NULL) return;
        if(root->left != NULL) getVec(root->left, nodes);
        nodes.push_back(root->val);
        if(root->right != NULL) getVec(root->right, nodes);
    }
    TreeNode* increasingBST(TreeNode* root) {
        vector<int> nodes;
        getVec(root, nodes);
        if(nodes.size() <= 1) return root;
        TreeNode* res = new TreeNode(nodes[0]);
        TreeNode* head = res;
        for(int i=1; i<nodes.size(); i++) {
            TreeNode * tmp = new TreeNode(nodes[i]);
            head->right = tmp;
            head = tmp;
        }
        return res;
    }
};

解法2:递归解法

这种解法较难,需要增加指针。

TreeNode* Solution::increasingBST(TreeNode* root) 
{
	return _increasingBST(root, NULL);
}
TreeNode* Solution::_increasingBST(struct TreeNode* root, struct TreeNode* pre) 
{
	if (!root) 
	{
		return pre;
	}
	struct TreeNode* tmp = _increasingBST(root->left, root);
	root->left = NULL;
	root->right = _increasingBST(root->right, pre);
	return tmp;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!