leetcode897.递增顺序查找树

本文介绍了一种树的数据结构操作方法,通过中序遍历将树重新排列,使得最左侧节点成为新树的根节点,每个节点仅保留右子节点。提供了两种解法,一种是先进行中序遍历存储节点,再根据结果重建树;另一种是使用递归解法,通过增加指针来实现。适用于1到100个节点的树,每个节点包含0到1000范围内的唯一整数值。

题目描述

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

提示:

  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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值