【数据结构】判断两棵二叉树是否相同的方法

判断两棵二叉树是否相同的方法

判断两棵二叉树是否相同这个问题的本质是需要我们思考如何唯一确定一棵二叉树,而唯一确定一棵二叉树的方法主要有以下几种:

  1. 二叉树的先序遍历+二叉树的中序遍历
  2. 二叉树的后序遍历+二叉树的中序遍历
  3. 扩展二叉树的先序遍历
  4. 扩展二叉树的后序遍历

当我们知道每一棵树的先序遍历和中序遍历时,可以通过两者的先序遍历和两者的中序遍历的比较来判断两棵树是否相同,同理,当我们知道每一颗树的后序遍历和中序遍历,或者知道每一颗扩展二叉树的先序遍历,抑或是每一颗扩展二叉树的后序遍历,都可以将其对应的遍历结果进行比较来判断两棵树是否相同。

【输入】

​ 两棵二叉树的根结点

​ (二叉树的结点数值是一定范围内的整数值)

【输出】

​ True or False

【思路】

​需要判断二叉树的每一个结点位置是否相同,结点上的数值是否相同,而上述四种方式都可以进行判断,但考虑复杂性,可以优先选择后两种,而如何将二叉树进行扩展呢?其实不用真的对二叉树进行结点的扩展,只需要在先序遍历或者后序遍历时,对空值结点进行特殊处理即可。

【代码】

​ 下面以扩展二叉树的先序遍历为例,只提供部分核心代码

public class A {
	   // EXTENSION为扩展结点的标志,其数值可以取不再结点数值范围中的任何合理数值
	   private static int EXTENSION = 100000;
	   
	   // 修改后的先序遍历,利用ArrayList对象来存储遍历过程
	   // 当遍历到扩展结点时,将EXTENSION标志存入ArrayList对象中,表示为扩展结点
	   public void pre(TreeNode p, ArrayList<Integer> list) {
			if(p == null) {
				list.add(NUM);
				return ;
			}
			list.add(p.val);
			pre(p.left, list);
			pre(p.right, list);
		}
		// 判断二叉树是否相同的函数
		public boolean isSameTree(TreeNode p, TreeNode q) {
			boolean flag = true;
			ArrayList<Integer> listOnePre = new ArrayList<>();
			ArrayList<Integer> listTwoPre = new ArrayList<>();
			
			A a = new A();
			a.pre(p, listOnePre);
			a.pre(q, listTwoPre);
			
			// 如果ArrayList对象中元素个数不同,则可以直接判断是不同的二叉树
			if(listOnePre.size() != listTwoPre.size()){
				return false;
			}
			
			for(int i=0; i<listOnePre.size(); i++) {	        
	             if(!listOnePre.get(i).equals(listTwoPre.get(i))){
					flag = false;
					break;
				}	
			}			
			
			return flag;		
		}
	
}

你可能感兴趣的:(二叉树,java,数据结构,算法,leetcode)