20211104 python 递归思路 创建二叉树 遍历 算法重要性

硅谷大神:为什么大厂面试喜欢考算法? - 知乎

怎么在Python中创建一个二叉树 - 开发技术 - 亿速云

class node():
    def __init__(self, k=None, l=None, r=None):
        self.val = k
        self.left = l
        self.right = r


def create_tree(val, root):
    """
    终止条件是什么, 字符串用完
    本次递归要干什么
    本次递归返回给上一级是什么?
    :param val:
    :param root:
    :return:
    """
    # 结束
    if len(val) == 0:
        return  root
    # 本次要干什么,生成中左右
    if val[0] != '#':
        root = node(val[0])
        val.pop(0)
        root.left = create_tree(val, root.left)
        root.right = create_tree(val, root.right)
        return root
    else:
        root = None
        val.pop(0)
        return root



# 层序遍历
def levelorder(root):
    res = []
    level = [root]
    while level:
        res.append([node.val for node in level])
        temp = []
        for node in level:
            temp.extend([node.left, node.right])
        level = [leaf for leaf in temp if leaf]
    return res


# 前序遍历
def preorderTraversal(now, result=[]):
    if now == None:
        return result
    result.append(now.val)
    preorderTraversal(now.left, result)
    preorderTraversal(now.right, result)
    return result

# 中序遍历
def intermediateTraversal(now, result=[]):
    if now == None:
        return result
    intermediateTraversal(now.left, result)
    result.append(now.val)
    intermediateTraversal(now.right, result)
    return result


# 后序遍历
def postorderTraversal(now, result=[]):
    if now == None:
        return
    postorderTraversal(now.left, result)
    postorderTraversal(now.right, result)
    result.append(now.val)
    return result


if __name__ == '__main__':
    Root = None
    strs = "abc##d##e##"  # 前序遍历扩展的二叉树序列
    vals = list(strs)
    Roots = create_tree(vals, Root)  # Roots就是我们要的二叉树的根节点。
    res1 = levelorder(Roots)
    print(res1)
    res2 = preorderTraversal(Roots, result=[])
    print(res2)
    res3 = intermediateTraversal(Roots, result=[])
    print(res3)
    res4 = postorderTraversal(Roots, result=[])
    print(res4)


二、求深度

# 用于生生一个类似于二叉树的数据
class Node:
    def __init__(self, value=None, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right


def tree_depth(tree):
    if tree is None:
        return 0
    left_depth = tree_depth(tree.left)
    right_depth = tree_depth(tree.right)
    return left_depth + 1 if left_depth > right_depth else right_depth + 1


trr = Node('D', left=Node('B', Node('A'), Node('C')), right=Node('E', right=Node('G', Node('F'))))
print(trr)
a = tree_depth(trr)
print(a)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值