递增顺序查找树(897)

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

示例:
输入:在这里插入图片描述
输出:在这里插入图片描述
思路分析:
一、大思路就是先中序遍历获得一个升序列表,然后将所获列表转换成题目所要求形式的二叉树。
二、在主函数中通过循环得到一棵树,具体解析在代码中。

算法复杂度分析:
1.时间复杂度O(N):需要遍历树的所有结点且只遍历一次。
2.空间复杂度O(N):递归调用栈辅助空间。

Code

class Solution {
	List<Integer> list = new LinkedList<>();
	public TreeNode increasingBST(TreeNode root) {
		helper(root);
		TreeNode node = null;
		int size = list.size();
		if (size > 0) {
			for (int i = size - 1; i >= 0; i--) { //这一步可以尝试使用顺序进行完成,详情见下
				TreeNode temp = new TreeNode(list.get(i));
				temp.left = null;
				temp.right = node;
				node = temp;
			}
		}
		return node;
	}
	public void helper(TreeNode root) {
		if (root == null) {
			return;
		}
		helper(root.left);
		list.add(root.val);
		helper(root.right);
	}
}

主函数中的循环可以使用顺序:

public TreeNode increasingBST(TreeNode root) {
		helper(root);
		TreeNode node = new TreeNode(0), cur = node;
		int size = list.size();
		if (size > 0) {
			for (int i = 0; i < size; i++) {
				cur.right = new TreeNode(list.get(i));
				cur = cur.right;
			}
		}
		return node.right;
}		

循环还有更简便的处理方式:

public TreeNode increasingBST(TreeNode root) {
		helper(root);
		TreeNode node = new TreeNode(0), cur = node;
		for (int v : list) {
			cur.right = new TreeNode(v);
			cur = cur.right;
		}
		return node.right;
}

PS: 学会完成树的创建,一定要形成结点与结点之间的连接,否则输出就不会是完整的一棵树,吸取本题经验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值