Contents

Leetcode:树的Traversal

In-Order

230. Kth Smallest Element in a BST (medium)

简述:在BST中,求第k小的值

思路:inorder,记录遍历idx

联系:模板题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# class Solution(object):
# 	def kthSmallest(self, root, k):
# 		"""
# 		:type root: TreeNode
# 		:type k: int
# 		:rtype: int
# 		"""
# 		self.idx, self.res = 0, None
# 		self.k = k
# 		self.inorder(root)
# 		return self.res
		
# 	def inorder(self, root):
# 		if root is None or self.res is not None:
# 			return
# 		if self.res is not None:
# 			return
# 		self.inorder(root.left)
# 		self.idx += 1
# 		if self.idx == self.k:
# 			self.res = root.val
# 		self.inorder(root.right)

938. Range Sum of BST (easy)

简述:求BST中值介于[L,R]的节点值的和

思路:inorder + 短路判断

联系:出自230

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# class Solution(object):
# 	def rangeSumBST(self, root, L, R):
# 		"""
# 		:type root: TreeNode
# 		:type L: int
# 		:type R: int
# 		:rtype: int
# 		"""
# 		self.res = 0
# 		self.L, self.R = L, R
# 		self.inorder(root)
# 		return self.res
	
# 	def inorder(self, root):
# 		if root is None:
# 			return
# 		self.inorder(root.left)
# 		if self.L <= root.val <= self.R:
# 			self.res += root.val
		if root.val > self.R:
			return
# 		self.inorder(root.right)

538. Convert BST to Greater Tree (easy)

简述:改变BST各节点值,使得节点值为后缀和

思路:inorder从后到前遍历

联系:出自230

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# class Solution(object):
# 	def convertBST(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: TreeNode
# 		"""
# 		self.running_total = 0
# 		self.inorder(root)
# 		return root
		
# 	def inorder(self, root):
# 		if root is None:
# 			return None
# 		self.inorder(root.right)
		root.val += self.running_total
		self.running_total = root.val
# 		self.inorder(root.left)

501. Find Mode in Binary Search Tree (easy)

简述:求BST中出现最多的值

思路:inorder建立字典

联系:出自230

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# class Solution(object):
# 	def findMode(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: List[int]
# 		"""
# 		if root is None:
# 			return []
# 		self.memo = dict()
# 		self.inorder(root)
		# 要点2-1: python语法,总结value
		mode = max(self.memo.values())
		res = [key for key in self.memo if self.memo[key] == mode]
# 		return res
		
# 	def inorder(self, root):
# 		if root is None:
# 			return
# 		self.inorder(root.left)
		# 要点2-2: 异常if用来,初始化key不在字典中的情况
		if root.val not in self.memo:
			self.memo[root.val] = 0
# 		self.memo[root.val] += 1
# 		self.inorder(root.right)

530. Minimum Absolute Difference in BST (easy)

简述:在BST节点对中,求最小的相差绝对值

思路:BST的in-order将返回排序数组

联系:出自230

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# class Solution(object):
# 	def getMinimumDifference(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: int
# 		"""
# 		self.res = sys.maxsize
		self.prev = None
# 		self.inorder(root)
# 		return self.res
	
# 	def inorder(self, root):
# 		if root is None:
# 			return
# 		self.inorder(root.left)
# 		if self.prev is not None:
# 			self.res = min(self.res, abs(root.val - self.prev))
# 		self.prev = root.val
# 		self.inorder(root.right)

783. Minimum Distance Between BST Nodes (easy)

简述:在BST节点对中,求最小的距离(相差)

思路:inorder,记录历史

联系:出自530

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# class Solution(object):
# 	def minDiffInBST(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: int
# 		"""
# 		self.prev, self.res = None, sys.maxsize
# 		self.inorder(root)
# 		return self.res
	
# 	def inorder(self, root):
# 		if root is None:
# 			return None
# 		self.inorder(root.left)
		
# 		if self.prev is not None:
# 			self.res = min(self.res, root.val - self.prev)
# 		self.prev = root.val
		
# 		self.inorder(root.right)

897. Increasing Order Search Tree (easy)

简述:把BST变为单向链表

思路:记录遍历前的node

联系:出自530

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# class Solution(object):
# 	def increasingBST(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: TreeNode
# 		"""
# 		self.dummy = TreeNode(0)
# 		self.p = self.dummy
# 		self.inorder(root)
# 		return self.dummy.right
	
# 	def inorder(self, root):
# 		if root is None:
# 			return
# 		self.inorder(root.left)
		
		root.left, self.p.right, self.p.left = None, root, None
		self.p = self.p.right
		
# 		self.inorder(root.right)

Pre-Order

144. Binary Tree Preorder Traversal (medium)

简述:二叉树pre-order遍历

思路:recursive简单,主要尝试iterative

联系:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# class Solution(object):
# 	def preorderTraversal(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: List[int]
# 		"""
# 		if root is None:
# 			return []
		# 要点1-1: 用stack存待搜索树
		stack = [root]
# 		res = []
# 		while stack:
# 			node = stack.pop()
# 			res.append(node.val)
# 			if node.right is not None:
# 				stack.append(node.right)
# 			if node.left is not None:
# 				stack.append(node.left)
# 		return res

965. Univalued Binary Tree (easy)

简述:判断树中节点值是否单一

思路:遍历时,维护全局变量

联系:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# class Solution(object):
# 	def isUnivalTree(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: bool
# 		"""
# 		if root.left is None and root.right is None:
# 			return True
# 		self.rootval, self.res = root.val, True
# 		self.preOrder(root)
# 		return self.res
		
# 	def preOrder(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: bool
# 		"""
# 		if root is None:
# 			return
# 		if root.val != self.rootval:
# 			self.res = False
# 		self.preOrder(root.left)
# 		self.preOrder(root.right)

Post-Order

backtrack

404. Sum of Left Leaves (easy)

简述:求二叉树中,所有左叶节点和

思路:左转向下时标注“左”,右转向下时标注“右”

联系:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# class Solution(object):
# 	def sumOfLeftLeaves(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: int
# 		"""
# 		self.res = 0
		self.inorder(root, False)
# 		return self.res
	
# 	def inorder(self, root, isLeft):
# 		if root is None:
# 			return
# 		self.inorder(root.left, True)
# 		if root.left is None and root.right is None and isLeft:
# 				self.res += root.val
# 		self.inorder(root.right, False)

Non-recursive

510. Inorder Successor in BST II (medium)

简述:给二叉树中某个节点,树中找in-order顺序中的下一个节点(此题节点额外含有:子->父)

思路:while

联系:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# class Solution(object):
# 	def inorderSuccessor(self, node):
# 		"""
# 		:type node: Node
# 		:rtype: Node
# 		"""
# 		if node is None:
# 			return None
# 		if node.right:
# 			curr = node.right
# 			while curr.left:
# 				curr = curr.left
# 			return curr
# 		else:
# 			curr = node
# 			while curr.parent and curr == curr.parent.right:
# 				curr = curr.parent
# 			return curr.parent

222. Count Complete Tree Nodes (medium)

简述:complete二叉树 (complete指从上到下,从左到右尽量排满),求树中节点个数

思路:最优复杂度O(logN*logN)

联系:树与二分法很漂亮的结合题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# class Solution(object):
# 	def countNodes(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: int
# 		"""
# 		if root is None:
# 			return 0
# 		height = self.findHeight(root)
# 		res_full = 2**height - 1
		
		# 要点3-1: 二分法模板
# 		left, right = 1, 2**height
# 		while left + 1 < right:
# 			mid = (left + right) // 2
# 			if self.pathHasNode(root, height, mid - 1):
# 				left = mid
# 			else:
# 				right = mid
		
# 		if self.pathHasNode(root, height, right - 1):
# 			return res_full + right
# 		else:
# 			return res_full + left
	
# 	def findHeight(self, root):
# 		res, p = 0, root
# 		while p.left:
# 			res += 1
# 			p = p.left
# 		return res
	
	# 要点3-2: path encoding
	def pathHasNode(self, root, height, encoding_int):
# 		p = root
		# 要点3-3: 构造mask,将encoded path从高位到地位二进制扫描出来
# 		mask = 2**(height-1)
# 		for _ in range(height):
			if encoding_int & mask == 0:
# 				if p.left is None:
# 					return False
# 				p = p.left
# 			else:
# 				if p.right is None:
# 					return False
# 				p = p.right
			mask >>= 1
# 		return True

701. Insert into a Binary Search Tree (medium)

简述:将所给值插入BST(假设原BST不含所给值)

思路:用BST性质

联系:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# class Solution(object):
# 	def insertIntoBST(self, root, val):
# 		"""
# 		:type root: TreeNode
# 		:type val: int
# 		:rtype: TreeNode
# 		"""
		# 要点1-1:边界情况
		if root is None:
			return TreeNode(val)
# 		p = root
# 		while True:
# 			if val > p.val:
# 				if p.right is None:
# 					p.right = TreeNode(val)
# 					return root
# 				else:
# 					p = p.right
# 			else:
# 				if p.left is None:
# 					p.left = TreeNode(val)
# 					return root
# 				else:
# 					p = p.left

94. Binary Tree Inorder Traversal (medium)

简述:不用递归,in-order遍历二叉树

思路:左子树为优先级

联系:出自510

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# class Solution(object):
# 	def inorderTraversal(self, root):
# 		"""
# 		:type root: TreeNode
# 		:rtype: List[int]
# 		"""
		if root is None:
			return []
		dummy = TreeNode(0)
		dummy.right = root
		stack = [dummy]
			
		inorder = []
		while stack:
			node = stack.pop()
			if node.right:
				# 想处理此节点,先把此节点的右子树加入优先级栈
				node = node.right
				while node:
					stack.append(node)
					node = node.left
			if stack:
				inorder.append(stack[-1].val)
				
		return inorder