樹和二叉樹

2021-07-03 12:27:53 字數 3999 閱讀 6809

判斷兩棵樹的結構和值是否全部一樣

# 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 8

/ / \

11 13 4

/ \ \

7 2 1

當存在根到葉子的路徑 5->4->11->2 的和是22,返回true

/* 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的完全二叉樹,其高度為 ...