題目的意圖很明顯,就是然你寫個程式看看是不是對稱的,對稱的條件很明顯:
//左子樹點值等於右子樹的值
leftchild->val == rightchild->val
然後我們想一想什麼樣的樹被稱為映象對稱?
是不是當乙個樹的左子樹與右子樹映象對稱,那麼這個樹是對稱的。那麼問題是不是可以轉化成:兩個樹在什麼情況下互為映象?
很明顯當子樹相互對稱應該符合一下條件:
1、它們的兩個根結點具有相同的值。
2、每個樹的右子樹都與另乙個樹的左子樹映象對稱。
//力扣給的結構體
/** * definition for a binary tree node.
* struct treenode ;
*/
;現在讓我來想想遞迴如何實現
1、遞迴就會有終止條件,那麼這個函式什麼時候表示遞迴結束呢?
當然是到達樹的這一分支的最大深度。那麼如何檢測遞迴到了樹的這一分支的最大深度,很顯然每一棵二叉樹,如果它不是根節點,那麼,當該節點的左右子樹都為空時,表示這樹的這一支就兜底了。
由於這是映象二叉樹的題而不是測深度,所以我們返回的條件有三種:
第一種,兩個節點都為空,返回 true;
第二種,兩個節點不都為空 ,返回 false;
第三種,兩個節點的值不相等,返回 false;
得出了終止條件遞迴就基本成型了,就剩下迭代了,迭代這個較為簡單,不在這裡贅述了。
貼**:
bool checkval(struct treenode* leftchild, struct treenode* rightchild)
if (null == leftchild || null == rightchild)
return (leftchild->val == rightchild->val) && checkval(leftchild->left, rightchild->right) && checkval(leftchild->right, rightchild->left);
}bool issymmetric(struct treenode* root)
return checkval(root->left, root->right);
}
迭代就不做細說了,這個實現起來太簡單了,bfs略微改改就行了
/**
* definition for a binary tree node.
* struct treenode ;
*/#define maxsize 1024
bool issymmetric(struct treenode* root)
if ((null == leftchild || null == rightchild) || (leftchild->val != rightchild->val))
queue[index++] = leftchild->left;
queue[index++] = rightchild->right;
queue[index++] = leftchild->right;
queue[index++] = rightchild->left;
}return true;
}
好吧,我這個更像棧一點。
演算法不易,諸君共勉!
leetcode(資料結構) 映象二叉樹
題目的意圖很明顯,就是然你寫個程式看看是不是對稱的,對稱的條件很明顯 左子樹點值等於右子樹的值 leftchild val rightchild val 然後我們想一想什麼樣的樹被稱為映象對稱?是不是當乙個樹的左子樹與右子樹映象對稱,那麼這個樹是對稱的。那麼問題是不是可以轉化成 兩個樹在什麼情況下互...
leetcode 資料結構 二分查詢
參考要求o logn 時間複雜度一般考慮二分法。int mid left right 2 在left和right都比較大的時候,left right很有可能超過int型別能表示的最大值,即整型溢位。int mid left right left 2 在right很大 left是負數且很小的時候,ri...
資料結構 二
字串處理 strlen 用來計算字元的長度,並不包括結束字元 0 空字元長度為0 1 include 2 3 int strlen char string 4 10 int main 11 strcpy char str1,char str2 用來拷貝字串,把str2每個字元都拷貝到str1中,直到...