python 二叉树从List创建和迭代遍历

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]

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值