二叉树(python)

二叉树的节点定义:

class TreeNode:#相当于链表,只不过多了一个指针
    def __init__(self , root):
        self.root = val
        self.left = None
        self.right = None

二叉树的遍历:

1.递归遍历 (前中后序遍历):

写递归时明白以下三个点就容易很多:a.首先确定递归函数的参数和返回值

                                                             b.确定终止条件

                                                             c.单曾的递归逻辑表达式

代码:

class TreeNode:
    def __init__(self,root):
        self.root = val
        self.left = None
        self.right = None

#递归前序遍历
class solution:
    def preodertraversal(self,root):

        result = []
        def traversal(root):
            if not root: #如果root为空
                return
            result.append(root.val) #中
            traversal(root.left) #左
            traversal(root.left) # 右

        traversal(root)
        return result

2.非递归前序遍历:

前序遍历的顺序是:中左右 ,每次先处理中间节点,将根节点放入栈中,然后再将右孩子加入栈中,然后就是左孩子(此时栈中【 右 ,左 -->】 按照出栈的顺序,左孩子先出栈)

利用栈来实现

#迭代前序遍历(中左右)
class solution:
    def preodertraversal(self,root:TreeNode):
        if not root:
            return
        stack = [root] # 把 root的根节点传入栈
        result = []   #保存结果

        while stack:
            #弹出节点
            node = stack.pop()
            # 先处理中间节点
            result.append(node.val)
            “”“
            #先要放入右节点
            # stack = [right,left)
            #先弹出左节点的(前序遍历(中左右))
            ”“”
            if node.right :
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
        return result

3.非递归后序遍历:

后序:左右中  

按照前序(中左右)的方法进行处理,然后反转:  中右左  ————>左右中

#迭代后序遍历(左右中)
class solution:
    def preodertraversal(self,root:TreeNode):
        if not root:
            return
        stack = [root] # 把 root的根节点传入栈
        result = []   #保存结果
        while stack:
            #弹出节点
            node = stack.pop()
            # 先处理中间节点
            result.append(node.val)
            if node.left:        #先放入左孩子
                stack.append(node.left) 
            if node.right :      #然后就是右孩子
                stack.append(node.right)    
        return result[::-1]     #进行数组发翻转

4.非递归中序遍历:

中序:左中右

此时的中序不同于之前的前后遍历(先处理中间节点),而中序是先访问二叉树顶部的节点,然后一层一层的往下访问直到树的左面的最底部,再来处理节点,这就使得访问和处理的顺序不一样,我们可以借助指针来访问节点:

#迭代中序遍历(左中右)
class solution:
    def preodertraversal(self,root:TreeNode):
        if not root:
            return
        stack = [] #不能把根节点直接放进去
        res =   []
        cur = root #指向根节点
        while stack or cur:
            if cur:#往树的左子树走,把访问过的加入栈
                stack.append(cur) #把当前访问的加入栈中
                cur = cur.left

            else:#当前节点为空,说明左边走到走了,弹出并保存
                cur = stack.pop()
                res.append(cur.val)
                cur = cur.right#然后继续指向右孩子,重复上面的过程
        return res

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值