輸入兩棵二叉樹a,b,判斷b是不是a的子結構。(ps:我們約定空樹不是任意乙個樹的子結構)1.子樹的意思是包含了乙個節點,就得包含這個節點下的所有節點,兩棵樹同時到底
2.子結構可以是a樹的任意一部分
思路:1.第乙個遞迴:a和b兩棵樹,先在a中找到與b的根結點相同的點,如果a的根不是,那就遞迴a的左右子樹來找
2.第二個遞迴:從兩棵樹的根結點開始進行比較,遍歷的過程中,如果b樹為空,則返回true;如果b不為空,a為空,返回false
a樹的結點值與b樹的不同,返回false;
短路運算子&&,遞迴a的左子樹,b的左子樹;遞迴a的右子樹,b的右子樹
hassubtree(treea,treeb)
if(treea->val==treeb->val)//
根結點相同
res=tree1hastreeb(treea.treeb)
if !res
res=hassubtree(treea->left.treeb)//
第一層遍歷
if !res
res=hassubtree(treea->right.treeb)//
第一層遍歷
return
restree1hastreeb(treea,treeb)
//順序不能變
if treeb==null
//b到底的時候,就是true
return
true
if treea==null
return
false
//b沒到底,a到底了,就是false
if treea->val!=treeb->val //
a和b的結點沒對上
return
false
//短路語法 ,如果前面的是false,直接返回false,後面不用走
return tree1hastreeb(treea->left,treeb->left)&&tree1hastreeb(treea->right,treeb->right)
<?phpclass
treenode }//
構造兩棵樹
$node1=new treenode(1);
$node2=new treenode(2);
$node3=new treenode(3);
$node4=new treenode(4);
$node5=new treenode(5);
$treea=$node1
;$node1->left=$node2
;$node1->right=$node3
;$node3->left=$node4
;$node3->right=$node5;//
var_dump($treea);
$node6=new treenode(3);
$node7=new treenode(4);
$node6->left=$node7
;$treeb=$node6;//
var_dump($treeb);
function hassubtree($proot1,$proot2
)function tree1hastree2($treea,$treeb
)var_dump(hassubtree($treea,$treeb));
二叉樹的子結構
include include stack include queue using namespace std 二叉樹結點 typedef struct bitnodebitnode,bitree 按先序序列建立二叉樹 int createbitree bitree t else return0 輸...
二叉樹的子結構
輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 第一種方法是使用遞迴的思想,第一步通過遞迴找到 跟子樹根節點相同的 結點,找到後 呼叫 函式chen,再依次遞迴比較每乙個 結點 是否相等。這種遞迴的時間複雜度 太高了 在牛客上執行不過去。class solut...
二叉樹 樹的子結構
題目描述 給定兩棵二叉樹tree1與tree2,現在要求判斷tree2是否為tree1的乙個子樹.分析 可以使用遞迴的方法,找到與tree2根節點值相同的tree1的節點n,然後遞迴呼叫函式對以n為根節點的子樹進行判定。include include using namespace std defi...