【二叉搜索树】1305. 两棵二叉搜索树中的所有元素(非递归中序遍历)

2023-05-16

题目

给你 root1 和 root2 这两棵二叉搜索树。

请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。.

示例 1:
在这里插入图片描述

输入:root1 = [2,1,4], root2 = [1,0,3]
输出:[0,1,1,2,3,4]

示例 2:

输入:root1 = [0,-10,10], root2 = [5,1,7,0,2]
输出:[-10,0,0,1,2,5,7,10]

示例 3:

输入:root1 = [], root2 = [5,1,7,0,2]
输出:[0,1,2,5,7]

示例 4:

输入:root1 = [0,-10,10], root2 = []
输出:[-10,0,10]

示例 5:
在这里插入图片描述

输入:root1 = [1,null,8], root2 = [8,1]
输出:[1,1,8,8]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-elements-in-two-binary-search-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


最简单的思路是遍历两棵树,将所有元素放到一个数组里,然后对数组排序。

由于二叉搜索树本来就是有序的,因此本文采用的是同时中序遍历两颗二叉搜索树,这里需要采用非递归的方式中序遍历二叉树,代码如下

public void InOrder(TreeNode root) {
	Stack<TreeNode> stack = new Stack<>();
	TreeNode curNode = root;
	while (curNode != null || !stack.isEmpty()) {
		while (curNode != null) {
			// 将所有左孩子入队
			stack.push(curNode);
			curNode = curNode.left;
		}
		if (!stack.isEmpty()) {
			TreeNode tmpNode = stack.pop();
			System.out.print(tmpNode.val + " ");
			curNode = tmpNode.right; // 移动到右孩子处(可能为null)
		}
	}
}

基于上述代码,同时中序遍历两颗二叉树,在遍历时,分别比较栈顶元素的大小,把小的元素添加到结果列表中,然后移动小元素所在的二叉树(即访问下一个节点),而另一颗二叉树不动,直到他的栈顶元素比另一颗树的小时才访问其它节点。

需要注意当有一个栈为空时,则表明其中一颗二叉树已经访问完了,此时只需中序遍历另一颗树即可。

class Solution {
	public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
		Stack<TreeNode> stack1 = new Stack<>(), stack2 = new Stack<>();
		TreeNode curNode1 = root1, curNode2 = root2;
		List<Integer> res = new LinkedList<>();
		while (curNode1 != null || !stack1.isEmpty() || curNode2 != null || !stack2.isEmpty()) {
			while (curNode1 != null) {
				stack1.push(curNode1);
				curNode1 = curNode1.left;
			}
			while (curNode2 != null) {
				stack2.push(curNode2);
				curNode2 = curNode2.left;
			}
			if (stack1.isEmpty()) {
				// 中序遍历stack2
				TreeNode topNode2 = stack2.pop();
				res.add(topNode2.val);
				curNode2 = topNode2.right;
			} else if (stack2.isEmpty()) {
				// 中序遍历stack1
				TreeNode topNode1 = stack1.pop();
				res.add(topNode1.val);
				curNode1 = topNode1.right;
			} else {
				TreeNode topNode1 = stack1.peek();
				TreeNode topNode2 = stack2.peek();
				if (topNode1.val <= topNode2.val) {
					stack1.pop();
					res.add(topNode1.val);
					curNode1 = topNode1.right;
				} else {
					stack2.pop();
					res.add(topNode2.val);
					curNode2 = topNode2.right;
				}
			}
		}
		return res;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【二叉搜索树】1305. 两棵二叉搜索树中的所有元素(非递归中序遍历) 的相关文章

  • 【动态规划】64. 最小路径和

    题目 给定一个包含非负整数的 m x n 网格 xff0c 请找出一条从左上角到右下角的路径 xff0c 使得路径上的数字总和为最小 说明 xff1a 每次只能向下或者向右移动一步 示例 输入 1 3 1 1 5 1 4 2 1 输出 7
  • 树莓派无法安装pyqt5与pandas

    问题描述 使用pip3 install安装一些包 xff0c 例如pyqt5 pandas无法成功 sudo pip3 install pandas sudo pip3 install pyqt5 无法安装 解决方案 xff1a 安装pan
  • 【Java】二维数组初始化

    带值初始化 span class token keyword int span a span class token punctuation span span class token punctuation span span class

随机推荐

  • 【图】1162. 地图分析(多源BFS)

    题目 你现在手里有一份大小为 N x N 的 地图 xff08 网格 xff09 grid xff0c 上面的每个 区域 xff08 单元格 xff09 都用 0 和 1 标记好了 其中 0 代表海洋 xff0c 1 代表陆地 xff0c
  • 【tensorflow】数据增强

    使用tf image对图片进行数据增强 读入图片 span class token keyword from span PIL span class token keyword import span Image span class to
  • 【HashMap】使用自定义类作为key

    需要重写hashCode 和equals 方法才能实现自定义键在HashMap中的查找 span class token keyword class span span class token class name Pos span spa
  • 【图】1267. 统计参与通信的服务器

    题目 这里有一幅服务器分布图 xff0c 服务器的位置标识在 m n 的整数矩阵网格 grid 中 xff0c 1 表示单元格上有服务器 xff0c 0 表示没有 如果两台服务器位于同一行或者同一列 xff0c 我们就认为它们之间可以进行通
  • 【并查集】Java实现

    并查集理解 并查集的数据结构实现一般是数组 xff0c 通过数组来指示各个元素之间的父子关系 xff0c 通常初始化为 1 xff0c 若最终该位置的值大于0 xff0c 则表示该位置是一个孩子 xff0c 其父亲为节点的值 并查集的两个重
  • 【并查集】721. 账户合并

    题目 给定一个列表 accounts xff0c 每个元素 accounts i 是一个字符串列表 xff0c 其中第一个元素 accounts i 0 是 名称 name xff0c 其余元素是 emails 表示该帐户的邮箱地址 现在
  • 【并查集】面试题 17.07. 婴儿名字

    题目 每年 xff0c 政府都会公布一万个最常见的婴儿名字和它们出现的频率 xff0c 也就是同名婴儿的数量 有些名字有多种拼法 xff0c 例如 xff0c John 和 Jon 本质上是相同的名字 xff0c 但被当成了两个名字公布出来
  • 【Java】字符串比较compareTo

    根据字典序比较两个字符串的大小 xff0c 使用compareTo方法 xff0c 如下 xff0c 如果字符串str1和str2相等则res 61 0 xff0c 若str1字典序小于str2则res lt 0 xff0c 否则res g
  • 【Java】String indexOf substring截取字符串

    使用indexOf char c 方法获取字符串中第一次出现字符c的下标 xff0c 例如 span class token keyword public span span class token keyword class span s
  • 树莓派3B+环境搭建

    转载 xff1a https blog csdn net zhangjun62 article details 80517176 我的树莓派3b 43 没有买HDMI 屏 xff0c 利用网线与电脑主机相连操纵树莓派 如果买回来接上电 xf
  • 【Scala】创建整型数组

    var res span class token operator 61 span new ArrayBuffer span class token punctuation span Int span class token punctua
  • 【RDD编程】map和mapPartitions

    map和mapPartitions map针对RDD中的每一个元素调用一次函数 xff0c 而mapPartitions针对RDD中每个Partition调用一次函数 xff0c 假设RDD有N个元素 xff0c 有M个分区 xff0c 那
  • 【Spark入门项目】词频统计

    项目要求 要求统计txt英文文件中每个单词出现的次数 txt文件内随机拷贝英文内容 xff0c 如下 The scientists re analysed a sample collected by NASA astronauts duri
  • 【jieba】中文分词

    span class token keyword import span jieba words span class token operator 61 span jieba span class token punctuation sp
  • 【Python】读取中文

    fn span class token operator 61 span span class token builtin open span span class token punctuation span path span clas
  • 【WordCloud】生成词云

    generate from frequencies xff1a 从频率字典中生成词云 该方法传入统计好的词频字典 xff0c 例如 39 Python 39 5 39 Hadoop 39 10 39 Spark 39 20 39 大数据 3
  • 【Spark入门项目】统计男女生身高的平均值、最大、最小值

    项目要求 分别统计男女生身高的平均值 最大 最小值 xff0c 数据格式为 xff08 ID xff0c sex xff0c height xff09 xff0c 如下 xff1a 1 M 174 2 F 165 3 M 180 4 M 1
  • 【Spark入门项目】关键词统计

    项目描述 统计txt文件中出现频率前10的关键词 xff0c 内如如下 实现流程 初始化spark配置通过textFile方法读取txt文件通过flatMap将RDD中的每一个元素调用split方法分词 xff0c split中使用jieb
  • 【二叉搜索树】面试题 17.12. BiNode

    题目 二叉树数据结构TreeNode可用来表示单向链表 xff08 其中left置空 xff0c right为下一个链表节点 xff09 实现一个方法 xff0c 把二叉搜索树转换为单向链表 xff0c 要求依然符合二叉搜索树的性质 xff
  • 【二叉搜索树】1305. 两棵二叉搜索树中的所有元素(非递归中序遍历)

    题目 给你 root1 和 root2 这两棵二叉搜索树 请你返回一个列表 xff0c 其中包含 两棵树 中的所有整数并按 升序 排序 示例 1 xff1a 输入 xff1a root1 span class token operator