leetcode(資料結構) 映象二叉樹

2021-10-19 05:17:24 字數 1788 閱讀 9231

題目的意圖很明顯,就是然你寫個程式看看是不是對稱的,對稱的條件很明顯:

//左子樹點值等於右子樹的值      

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中,直到...