1. 程式人生 > 其它 >【劍指offer較難部分6】樹的子結構(java)

【劍指offer較難部分6】樹的子結構(java)

技術標籤:劍指offer(java)java二叉樹演算法資料結構

題目描述

輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
在這裡插入圖片描述

分析

思路:
1、層次遍歷root1, 找到與root2相同的節點
2、相同結點找到後判斷以此節點為根節點,是否能在root1中找到與root2相同的樹結構

實現程式碼如下:

import java.util.Queue;
import java.util.LinkedList;
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2)
{ if(root1 == null || root2 == null){ return false; //空樹不是任意一個樹的子結構,兩棵樹的根節點均不空 } //第一步、在root1中找到與root2根節點相同的結點,用層次遍歷 Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.add(root1); TreeNode cur; while(!queue.isEmpty()
){ int size = queue.size(); for(int i = 0 ; i < size ; i++){ cur = queue.poll(); //出隊,cur接收出隊結點 //找到與根節點root2相同的結點 if(cur.val == root2.val){ //判斷子結構是否相等 if(isHasSubtreeHelper(cur, root2)){ return
true; } } if(cur.left != null){ queue.offer(cur.left); } if(cur.right != null){ queue.offer(cur.right); } } } return false; } //第二步:判斷子結構是否相同 public boolean isHasSubtreeHelper(TreeNode root1, TreeNode root2) { if (root2 == null) { return true; //1、root2為空,說明root2遍歷完畢,則返回true } if (root1 == null) { return false; //2、root1為空,root2不為空,root1遍歷完畢,root2還沒有遍歷完,返回false } if (root1.val != root2.val) { return false; //3、兩者都不為空,值不同,返回false } return isHasSubtreeHelper(root1.left, root2.left) && isHasSubtreeHelper(root1.right, root2.right); } }

在這裡插入圖片描述