JAVA进步一点点--数据结构与算法(深搜)--971. 翻转二叉树以匹配先序遍历

971. 翻转二叉树以匹配先序遍历

在这里插入图片描述
题目看了半天没看懂,官网解答也看的迷迷糊糊,发现一个大神只有29行代码的解答,反而让我豁然开朗,特意记录一下题目过程。
分析
要求二叉树的先序遍历和voyage序列匹配,如果不匹配是允许旋转子树的,但这个旋转只是交换左子节点和右子节点的位置,不是真正的全部翻转,就如例子里的,2和3互换了位置,4和5没有互换位置,这里的互换相当于搜索顺序变一下。

在这里插入图片描述
因此,题目可以这么分析:
(1)二叉树的先序遍历,并记录到voyage的那个元素了,对值进行对比。
(2)如果当前元素不相等,已经无法旋转了,直接返回-1
(3)如果当前元素相等,后一个元素不相等,则需要旋转(即先遍历右子树,再遍历左子树)

	List<Integer> result = new ArrayList<>();
	int index = 0;

	public List<Integer> flipMatchVoyage(TreeNode root, int[] voyage) {
		if (dfs(root, voyage)) {
			return result;
		}
		return Arrays.asList(-1);

	}

	public boolean dfs(TreeNode root, int[] voyage) {
		if (root == null) {
			return true;
		}
		if (root.val != voyage[index++]) {
			return false;
		}
		if (root.left != null && root.left.val != voyage[index]) {
			result.add(root.val);
			return dfs(root.right, voyage) && dfs(root.left, voyage);
		}
		return dfs(root.left, voyage) && dfs(root.right, voyage);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值