樹的子結構


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

分析
在這里插入圖片描述
查找A中是否存在樹B結構一樣的子樹,可以分為兩步:
第一步,在樹A中找到和樹B的根節點的值一樣的節點R
第二步,判斷A中以R為根節點的子樹是不是包含和樹B一樣的結構

以上面為例,先在A中找到值為8的節點,接着判斷樹A的根節點下面的子樹是不是含有和樹B一樣的結構。在A中根節點的左子節點為8,而樹B的根節點的左子節點為9,對應兩個節點不同。
接着找8的節點,在A中第二層找到,然后進行第二步的判斷(判斷這個節點下面的子樹是否含有樹B一樣的結構)

代碼
第一步

	public boolean HasSubtree(TreeNode root1,TreeNode root2) {

		boolean result = false;

		//當root1和root2都不為null的時候,才進行比較。否則直接返回false
		if(root1 != null && root2 != null) {
			//如果找到了對應root2的根節點的點
			if(root1.val == root2.val) {
				//以這個根節點為為起點判斷是否包含root2
				result = DoesTreeHaveTree2(root1, root2);
			}

			if(!result) {
				//如果找不到,那么就再去root1的左兒子當作起點,去判斷時候包含root2
				result = HasSubtree(root1.left, root2);
			}

			if(!result) {
				//如果還找不到,那么就再去root1的右兒子當作起點,去判斷時候包含root2
				result = HasSubtree(root1.right, root2);
			}
		}
		return result;
	}

第二步

	public boolean DoesTreeHaveTree2(TreeNode node1, TreeNode node2) {

		//如果node2已經遍歷完了都能對應的上,返回true
		if(node2 == null) {
			return true;
		}

		//如果node2還沒有遍歷完,node1卻遍歷完了。返回false
		if(node1 == null) {
			return false;
		}

		//如果其中有一個點沒有對應上,返回false
		if(node1.val != node2.val) {
			return false;
		}

		//如果根節點對應的上,那么就分別去子節點里面匹配
		return DoesTreeHaveTree2(node1.left, node2.left) && DoesTreeHaveTree2(node1.right, node2.right);

	}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM