樹 劍指 Offer 28 對稱的二叉樹

2021-10-08 09:06:38 字數 1705 閱讀 9377

請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。

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

1

/ \ 2

2/ \ / \34

43

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

1

/ \ 2

2 \ \

33

示例 1:

輸入:root = [1,2,2,3,4,4,3] 輸出:true 示例 2:

輸入:root = [1,2,2,null,3,null,3] 輸出:false

利用層序遍曆法遍歷二叉樹的每一層,若二叉樹是對稱的,則每一層節點也是關於中心對稱的,使用兩個佇列,解法類似於二叉樹的深度,第乙個佇列nowlevel用來記錄當前層的所有節點,第二個佇列nextlevel用來記錄下一層的所有節點,每次迴圈時將nextlevel的所有節點新增到nowlevel中,然後再遍歷nowlevel中的每個節點,並將其左右孩子節點新增到nextlevel中,同時新建乙個陣列arr記錄左右孩子的節點值,若孩子節點為null也需要記錄乙個特定的值,例如-99,然後判斷arr陣列是否為對稱陣列,若不是對稱的則直接返回false,若遍歷完所有層則表明該樹為對稱的二叉樹,返回true

class

solution

public

boolean

levelorder

(treenode rootnode)

else

arr[pos++]=

-99;if

(node.right != null)

else

arr[pos++]=

-99;}

}for

(int i =

0; i < pos /

2; i++)if

(arr[i]

!= arr[pos -

1- i]

)return

false;}

return

true;}

}

若二叉樹是對稱的,則根節點的左節點和右節點的值一定相等,左節點的左孩子和右節點的有孩子相等 && 左節點的右孩子和右節點的左孩子也一定相等,根據這一條件可寫出遞迴形式,即兩對節點均返回truesymmetric(l.left, r.right) && symmetric(l.right, r.left)。這個方法比上一種方法快很多,上一種方法用到了兩個佇列,需要多次出隊入隊,消耗時間。

class

solution

public

boolean

symmetric

(treenode l, treenode r)

}

劍指offer 28對稱的二叉樹

題目 判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。思路分析 剛解答過27題,容易受上題影響,但大致思路是一致的 遞迴和迭代。舉乙個對稱的二叉樹例子可知,若二叉樹是對稱的,則其左子樹的左節點和其右子樹的右節點相等,左子樹的右節點和其右子樹的左節點相等。遞迴public b...

劍指 Offer 28 對稱的二叉樹

請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。例如,二叉樹 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示例 1 輸入 root 1 2,2...

劍指 Offer 28 對稱的二叉樹

請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。例如,二叉樹 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 示例 1 輸入 root 1,2,...