對於一棵二叉樹,如何判斷這棵二叉樹是否是對稱的二叉樹?
例如:
從以上的圖中我們可以看出,關於根節點左右對稱的二叉樹就是對稱的二叉樹,那麼在程式中我們需要如何判斷呢?
在二叉樹的先序遍歷中,先訪問根結點,再訪問左子樹,再訪問右子樹。
如果是對稱的二叉樹,那麼它的左右子樹應該是一樣的,也就是先訪問根,再訪問右子樹,最後訪問左子樹得到的結果應該是一樣的。
對於上圖中的第一幅圖,
先序遍歷的結果是:8 6 5 7 6 7 5
對稱先序遍歷: 8 6 5 7 6 7 5
一樣的序列,所以第一幅圖是對稱的二叉樹。
對於第二幅圖:
先序遍歷的結果是:9 9 9 9 9 9
對稱先序序列是: 9 9 9 9 9 9
雖然這兩個序列是一樣的,但是第二幅圖一看就不是對稱的二叉樹,這就是空子樹搞的事。所以,當按照兩種方式進行遍歷二叉樹的時候,指向的結點乙個為null乙個不為null,那麼這個二叉樹一定不對稱。
對於第三幅圖:
先序遍歷的結果是:3 4 5 6 7 6 5
對稱先序序列是: 3 7 5 6 4 6 5
明顯不同,所以這個二叉樹也是不對稱的。
鑑於以上的分析,我們可以畫出這個程式的大致流程(都從根節點出發,乙個先走左子樹,乙個先走右子樹):
**實現:
#includeusing namespace std;
templatestruct binarynode
};templateclass binarytree
bool symmetric()
bool _symmetric(node* leftroot,node* rightroot)
protected:
node* _create(t arr,int size,int& index,const t& invalid)
return root;
}protected:
node* _root;
};void test()
; //int arr = ;
binarytreebt(arr,sizeof(arr)/sizeof(arr[0]),'#');
cout<
劍指offer系列之三十八 判斷是否是平衡二叉樹
題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。所謂平衡二叉樹就對某個結點來講,其左子樹的深度與右子樹深度的絕對值不超過1。由於需要對每個節點進行判斷,所以可以採用遞迴的思路進行解決。具體思路是 先求出根節點的左右子樹的深度,並對兩者進行判斷,如果沒有滿足左右子樹的深度的絕對值不超過1的條件...
劍指offer 判斷B樹是否是A樹的子結構
題目描述 輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 一道蠻有意思的題,一開始理解錯題意了,只考慮了b樹完全覆蓋了a中某棵子樹,並且以為一定存在根節點相同就完全匹配b樹的子樹。然後想著只要從a樹根節點往下遍歷直到找到乙個節點與b的根節點匹配即可。還是想的太...
劍指offer59 判斷二叉樹是否對稱
請實現乙個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。思路 首先根節點以及其左右子樹,左子樹的左子樹和右子樹的右子樹相同左子樹的右子樹和右子樹的左子樹相同即可,採用遞迴 public class treenode public class so...