python 二叉树从List创建和迭代遍历
csdn真的都是水,不是你从c抄过来都不运行一下看看能不能用吗?太敷衍了吧。。。还是写这玩意是赚钱的手段。还有那些要给做深度学习算法的找工作的人考算法考试的人,****!
从List创建二叉树。主要参考了Carl老师的代码随想录的C程序。
class TreeNode():
def __init__(self, x, left=None, right=None):
self.val = x
self.lchild = left
self.rchild = right
v = [3,9,20,None,None,15,7]
def Create_Tree(root, vals:list, i):
if len(vals) == 0:
return None
if vals[i] == None:
return TreeNode(None)
Root = TreeNode(vals[i])
if 2 * i + 1 <= leng - 1:
Root.lchild = Create_Tree(Root.lchild, vals, 2 * i + 1)
else:
Root.lchild = TreeNode(None)
if 2 * i + 2 <= leng - 1:
Root.rchild = Create_Tree(Root.rchild, vals, 2 * i + 2)
else:
Root.rchild = TreeNode(None)
return Root
def preOrder(root):
if root == None:
return None
print(root.val, end='\t') # \t H-tab, \v V-tab, \n 换行, \0 null, \b backspace
preOrder(root.lchild)
preOrder(root.rchild)
Tree = Create_Tree(Root, v, 0)
preOrder(Tree)
由于是从List创建,所以要增加TreeNode类型的None节点,①防止在下面遍历的时候15、7这种叶子节点没有null;②让建立Null节点的时候不会出现:node.val是None而type是TreeNode不是None的情况,都是TreeNode直接判断node.val而不是node。
迭代遍历(前序、后序、中序、层序)
前序和后序都用到栈。用List代替栈,list.append等于stack.push,list.pop等于stack.pop。后序要用stack2存储pop出的当前根节点,中序要先向左遍历到左叶子节点为null然后返回遍历右子树。在中序的时候,由于不是指针不能直接判断node==None而是判断node.val。
def preOrder1(root):
if root == None:
return None
stack = []
result = []
stack.append(root)
while len(stack)!=0:
node = stack.pop()
result.append(node.val)
if node.rchild: # 先右后左,方便出栈顺序倒置
stack.append(node.rchild)
if node.lchild:
stack.append(node.lchild)
return result
def postOrder1(root):
if root == None:
return None
stack1 = []
stack2 = []
result = []
stack1.append(root)
while len(stack1)!=0:
node = stack1.pop()
stack2.append(node)
if node.lchild: # 先左后右入st1出栈为根、右左入st2再次出栈倒置为:左右根
stack1.append(node.lchild)
if node.rchild:
stack1.append(node.rchild)
while len(stack2)!=0: # 不能直接从前序倒置,代码随想录二叉树2.0好像有问题?
result.append(stack2.pop().val)
return result
def inOrder1(root):
if root == None:
return None
stack = []
result = []
node = root
while node.val or len(stack) != 0:
if node.val: # 不同点
stack.append(node)
node = node.lchild
else:
result.append(None) # 不同点
node = stack.pop()
if node:
result.append(node.val)
node = node.rchild
return result
def levelOrder(root):
if root == None:
return None
queue = []
result = []
queue.append(root)
while len(queue) != 0:
size = len(queue)
for i in range(size):
node = queue.pop(0) # 先入先出,List仿队列
result.append(node.val)
if node.lchild:
queue.append(node.lchild)
if node.rchild:
queue.append(node.rchild)
return result
if __name__ == "__main__":
Root = None
Tree = Create_Tree(Root, v, 0)
preOrder(Tree)
ls = preOrder1(Tree)
print(ls)
ls = postOrder1(Tree)
print(ls)
ls = inOrder1(Tree)
print(ls)
ls = levelOrder(Tree)
print(ls)
print("pause")
print:
3 9 None None 20 15 None None 7 None None
[3, 9, None, None, 20, 15, None, None, 7, None, None]
[None, None, 9, None, None, 15, None, None, 7, 20, 3]
[None, 9, None, 3, None, 15, None, 20, None, 7]
[3, 9, 20, None, None, 15, 7, None, None, None, None]