94. 二叉树的中序遍历
中序遍历是指先访问左子树再当前节点最后右子树
非递归方式:
用列表模拟栈对树进行遍历, 对于当前节点, 如果它有左子树则先访问左子树, 左子树访问完毕或没有左子树则将其值加入遍历结果中, 再访问右子树
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
inorder = [] # 存储遍历结果
stack = [] # 记录节点访问顺序
if root:
stack.append(root) # 从根节点开始
else:
return inorder
while True:
if len(stack) == 0:
return inorder
if stack[-1].left: # 当前节点有左子树的话, 下一步访问该左子树
stack.append(stack[-1].left)
stack[-2].left = None # 当前节点的左子树访问结束后, 避免重新进入该子树
continue
else:
inorder.append(stack[-1].val) # 当前节点没有左子树, 则将其加入
t = stack[-1].right
stack.pop()
if t:
stack.append(t) # 若有右子树则入栈
96. 不同的二叉搜索树(BST)
求由n个不同节点组成的可能的合法二叉搜索树的个数.
每个节点都可以当根节点, 若当前为从小到大第k个节点, 另f(k)表示k个节点的树可能的数目, 则其左子树的节点个数可以为 0 ~ k - 1, 右子树相应为k - 1 ~ 0.
class Solution:
def numTrees(self, n: int) -> int:
n_tree = [1]
for i in range(1, n + 1):
n_tree.append(0)
for j in range(i):
n_tree[i] += n_tree[j] * n_tree[i - 1 - j]
return n_tree[n]