判斷兩棵樹的結構和值是否全部一樣
# definition for a binary tree node.
# class treenode
# attr_accessor :val, :left, :right
# def initialize(val)
# @val = val
# @left, @right = nil, nil
# end
# end
# 以上是二叉樹的ruby宣告,下面凡是使用ruby編寫的解法都用此宣告
# @param p
# @param q
# @return
defis_same_tree(p, q)
return
true
if p.nil? && q.nil?
return
false
if p.nil? || q.nil? || p.val != q.val
return is_same_tree(p.left, q.left) && is_same_tree(p.right, q.right)
end
same tree
其實就是翻轉左右子樹,遞迴版的寫起來很簡單
# ruby
def invert_tree(root)
return root if root == nil
root.left, root.right = root.right, root.left
invert_tree(root.left)
invert_tree(root.right)
root
end
非遞迴版的用兩個佇列做層序遍歷, 邏輯也很簡單
def invert_tree(root)
return root if root == nil
arr1, arr2 = [root],
until arr1.empty? do
arr2 << arr1.shift until arr1.empty?
arr2.each
do |r|
r.left, r.right = r.right, r.left
arr1 << r.left if r.left
arr1 << r.right
if r.right
end arr2.clear
end root
end
心情好,又寫了個c++版的非遞迴
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
while(!q2.empty())
}return root;
}};
invert binary tree
用層序遍歷求二叉樹的深度,方法幾乎和上例一樣
# ruby
def max_depth(root)
return
0 unless root
arr1 = [root]
depth = 0
arr2 =
until arr1.empty? do
depth += 1
arr2 << arr1.shift until arr1.empty?
until arr2.empty? do
tmp = arr2.pop
arr1 << tmp.left if tmp.left
arr1 << tmp.right
if tmp.right
end end
depth
end
maximum depth of binary tree
二叉樹的最小深度即從根節點到最近的葉子節點的路徑長度。
非遞迴層序遍歷(雙棧)解法:
# python
defmindepth
(self, root):
stack1 = [root]
stack2 =
mindepth = 0
while stack1:
if stack1[0]:
mindepth += 1
while stack1:
while stack2:
node = stack2.pop()
if node:
if node.left:
if node.right:
ifnot node.left and
not node.right:
return mindepth
return mindepth
我的遞迴解法:
def
mindepth
(self, root):
ifnot root:
return0if
not root.left and
not root.right:
return
1if root.left and root.right:
return
1 + min(self.mindepth(root.left), self.mindepth(root.right))
if root.right:
return self.mindepth(root.right) + 1
else:
return self.mindepth(root.left) + 1
是不是很囉嗦,leetcode上最近有個很活躍的牛人stefanpochmann (49,810 points) , 多項魔方世界紀錄保持者,能用5個球玩juggling,各種問題都喜歡用1~3行的**搞定,下面是他的遞迴解法,是不是很簡練?
def
mindepth
(self, root):
ifnot root: return
0 a, b = sorted(map(self.mindepth, (root.left, root.right)))
return
1 + (a or b)
minimum depth of binary tree
判斷從根到葉子的路徑和是否與給定的數相同
for example:
given the below binary tree and sum = 22,
當存在根到葉子的路徑 5->4->11->2 的和是22,返回true5
/ \4 8
/ / \
11 13 4
/ \ \
7 2 1
/* c */
bool haspathsum(struct treenode* root, int sum)
我只能說,太適合用遞迴的先序遍歷了
def lowest_common_ancestor(root, p, q)
return root if root.nil? || root == p || root == q
left = lowest_common_ancestor root.left, p, q
right = lowest_common_ancestor root.right, p, q
return root if
left && right
left
orright
end
二叉樹 滿二叉樹和完全二叉樹
二叉樹是一種很重要的非線性資料結構,它是樹結構的一種重要的型別 它不是樹結構的特殊情況 其特徵是每個節點最多有兩個子樹。二叉樹的特點 二叉樹每個結點最多有 2個子結點,樹則無此限制 二叉樹中 結點的子樹 分成左子樹和右子樹,即使某結點只有一棵子樹,也要指明該子樹是左子樹,還是右子樹,就是說 二叉樹是...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...
二叉樹和完全二叉樹
二叉樹規律 假設根節點的高度為0 二叉樹是每個節點至多只有兩個節點的樹 深度為i所在的層至多有 2 i個節點 高度為k的二叉樹至多有2 k 1 1個節點 n0表示度為0的節點,n2表示度為2的節點,存在n0 n2 1 對所有樹有 節點個數 邊數 1 完全二叉樹規律 節點數為n的完全二叉樹,其高度為 ...