前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >树的遍历

树的遍历

作者头像
西西嘛呦
发布2020-08-26 10:08:31
5610
发布2020-08-26 10:08:31
举报

首先是树的建立:

代码语言:javascript
复制
class TreeNode:
    def __init__(self,x,left=None,right=None):
        self.val=x
        self.left=left
        self.right=right

建立好的树如图所示:

一、递归版的遍历(很好记)

代码语言:javascript
复制
class traveral:
    def __init__(self):
        self.pre_res=[]
        self.in_res=[]
        self.post_res=[]
    #先序遍历(根左右)
    def preorder(self,root):
        if root is None:
            return None
        self.pre_res.append(root.val)
        self.preorder(root.left)
        self.preorder(root.right)
    #中序遍历(左根右)
    def inorder(self,root):
        if root is None:
            return None
        self.inorder(root.left)
        self.in_res.append(root.val)
        self.inorder(root.right)
    #后序遍历(左右根)
    def postorder(self,root):
        if root is None:
            return None
        self.postorder(root.left)
        self.postorder(root.right)
        self.post_res.append(root.val)

tra=traveral()
tra.preorder(root)
tra.inorder(root)
tra.postorder(root)
print(tra.pre_res)
print(tra.in_res)
print(tra.post_res)

输出:

二、非递归版本

代码语言:javascript
复制
class non_recursive:
    def preorder(self,root):
        stack=[]
        pre_res=[]
        while root or stack:
            while root:
                pre_res.append(root.val)
                stack.append(root)
                root=root.left
            if stack:
                t=stack.pop()
                root=t.right
        return pre_res

    def inorder(self,root):
        stack=[]
        in_res=[]
        while stack or root:
            while root:
                stack.append(root)
                root=root.left
            if stack:
                t=stack.pop()
                in_res.append(t.val)
                root=t.right
        return in_res

    def postorder(self,root):
        stack1=[]
        stack2=[]
        post_res=[]
        stack1.append(root)
        while stack1:
            t=stack1.pop()
            if t.left:
                stack1.append(t.left)
            if t.right:
                stack1.append(t.right)
            stack2.append(t)
        while stack2:
            post_res.append(stack2.pop().val)
        return post_res

    def levelorder(self,root):
        queue=[root]
        level_res=[]
        while queue:
            t=[]
            for i in range(len(queue)):
                cur=queue.pop(0)
                t.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
            level_res.append(t)
        return level_res
nonre=non_recursive()
print(nonre.preorder(root))
print(nonre.inorder(root))
print(nonre.postorder(root))
print(nonre.levelorder(root))

输出:
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档