劍指offer(十七)——樹的子結構

劍指offer(十七)——樹的子結構

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

題解
首先理解題意,B是A的子結構的前提是,B樹是A樹的一部分,即從B的根節點開始,要與A其中一個結點開始,結點值完全一致。
在這裏插入圖片描述

  • 因爲已經說了,空樹不是子結構,所以先行判定兩樹是否爲空。
  • 然後我們需要在A樹中找到與B樹根節點對應的節點,從那裏開始進行判定,因此我們創建了一個函數IsSubtree(TreeNode,TreeNode)用來判定所有節點是否相符。
	public boolean HasSubtree(TreeNode root1,TreeNode root2) {
		if (root1 == null || root2 == null) {
			return false;
		}
		//從該節點開始判定是否相符
		//從A樹的左孩子開始判定是否相符
		//從A樹的右孩子開始判定是否相符
		return IsSubtree(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
    }
	
	public boolean IsSubtree(TreeNode root1, TreeNode root2) {
	//當B樹遍歷完之後,即B樹爲A樹子結構,返回true
		if (root2 == null) {
			return true;
		}
		//當A樹遍歷完,但是B樹沒有,證明不是子結構,返回false
		if (root1 == null) {
			return false;
		}
		//當該節點一致時,同時向其孩子搜索判定
		if (root1.val == root2.val) {
			return IsSubtree(root1.left, root2.left) && IsSubtree(root1.right, root2.right);
		}else {
			return false;
		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章