刷題 樹篇 101 對稱二叉樹

2021-08-30 19:46:51 字數 1600 閱讀 5684

101. 對稱二叉樹

給定乙個二叉樹,檢查它是否是映象對稱的。

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。

1/ \

2   2

/ \ / \

3  4 4  3

但是下面這個 [1,2,2,null,3,null,3] 則不是映象對稱的:

1/ \

2   2

\   \

3    3

高階:你可以運用遞迴和迭代兩種方法解決這個問題嗎?

思路:映象對稱,在某個節點root上總左右相等:root.left == root.right,擴充套件開來就是左右子樹的映象對稱。

那麼考慮從根節點開始,對左右子樹分別進行映象遍歷。

例如,對左子樹:根-左-右,那麼對右子樹則是:根-右-左。

**如下:

遞迴實現:

func issymmetric(root *treenode) bool 

rl := root.left

rr := root.right

flag := true

run(rl,rr,&flag)

return flag

}func run(l,r *treenode,flag *bool)

if (l == nil && r != nil) || (l != nil && r== nil)

if l != nil && r != nil

}//左右採用映象遍歷

run(l.left,r.right,flag)

run(l.right,r.left,flag)

}

非遞迴方法,我使用的是非遞迴前序遍歷,用其他遍歷方法也可。

func issymmetric(root *treenode) bool 

stackl := make(*treenode,0)

stackr := make(*treenode,0)

l := root.left

r := root.right

//前序映象遍歷

for len(stackr)!=0 || len(stackl) != 0 || l != nil || r != nil

if l != nil && r == nil

for l != nil && r != nil

l = l.left

r = r.right

if l == nil && r != nil

if l != nil && r == nil

}ltop := stackl[len(stackl)-1]

rtop := stackr[len(stackr)-1]

stackl = stackl[:len(stackl)-1]

stackr = stackr[:len(stackr)-1]

l = ltop.right

r = rtop.left

if l == nil && r != nil

if l != nil && r == nil

}return true

}

101 對稱二叉樹(樹)

方法一 遞迴 一棵樹是對稱的,當它的左子樹和右子樹是映象時,滿足條件 所以用遞迴很好解決 definition for a binary tree node.public class treenode class solution public boolean symmetric treenode ...

101 對稱二叉樹

給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。思路 遞迴就用dfs,迭代是b...

101 對稱二叉樹

給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。解題思路 對稱二叉樹可以理解...