第一步:
根據題意可知,需要乙個函式判斷樹a和樹b是否有相同的結構。顯然是個遞迴程式。可考察遞迴程式3部曲。
遞迴函式的功能:判斷2個數是否有相同的結構,如果相同,返回true,否則返回false
遞迴終止條件:
此處採用兩個遞迴,乙個遞迴用來遍歷樹節點,乙個遞迴用來判斷二者是否是包含關係,記錄思路備忘。
# -*- coding:utf-8 -*-
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
# class solution:
# def hassubtree(self, proot1, proot2):
# if proot1 == none or proot2 == none:
# return false
# -*- coding:utf-8 -*-
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class solution:
def hassubtree(self, proot1, proot2):
# write code here
if not proot1 or not proot2:
return false
#根節點以proot2為主,判斷proot2是否和當前proot1節點相同
# ,若相同,採用遞迴判斷左右子節點分別是否相等,這裡採用遞迴判斷左右子節點是否相等
#若不相等,則繼續判斷proot1的左子樹部分是否含proot2;proot1的右子樹部分是否含proot2;採用遞迴
def hasequal(proot1, proot2):
if not proot1 or not proot2:
return false
if proot1.val == proot2.val:#根節點相同再去判斷左右子節點是否相同
#注意proot1的左右子節點可能為空,只要保證proot1的部分與proot2相等即可
if proot2.left == none:
leftequal = true
else:
leftequal = hasequal(proot1.left, proot2.left)
if proot2.right == none:
rightequal = true
else:
rightequal = hasequal(proot1.right, proot2.right)
return leftequal and rightequal
return false
ret = hasequal(proot1,proot2)
if ret:
return true
ret = self.hassubtree(proot1.left, proot2)
if ret:
return true
ret = self.hassubtree(proot1.right, proot2)
if ret:
return true
樹的子結構
題目 輸入兩顆二叉樹a和b 判斷b是不是a的子結構 二叉樹結點定義如下 首先 從樹根開始遍歷樹 如果結點與 b的根結點值相同 則繼續遍歷a的左子樹 以及b的左子樹 如果左子樹相同則遍歷a的右子樹以及b的左子樹 如果左右子樹都相同則 a包含b 如果結點與b的根節點值不同 則遍歷到a的左孩子 重複上述判...
樹的子結構
來自 劍指offer 的面試題18。題目 輸入兩棵二叉樹a和b,判斷b是不是a的子結構。二叉樹節點定義如下 public class treenode 思路分析 首先,在tree1中找到和tree2的根節點的值一樣的結點r 然後,再判斷tree1中以r為根結點的子樹是不是包含和tree2一樣的結構。...
樹的子結構
輸入兩顆二叉樹a,b,判斷b是不是a的子結構 思路 1 先判斷兩棵樹是否為空,是則沒有子樹 2 當兩棵樹為非空時,判斷當前的兩個根節點是否為子樹關係,若值相等,則繼續判斷左右子樹是否也對應相等 3 當根節點非子樹關係時,再判斷a樹的左右子樹和b樹是否有子樹。public class treenode...