2022.03.16

课时59二叉树的的先序,中序,后序遍历

 

 先序遍历,先根,左,右。

 

中序遍历:左-》根-》右 

 

后序遍历:左-右-根。 

 

 

class Node(object):

    def __init__(self,item):
        self.elem=item
        #与链表不同的地方,链表只有一个后继的链接区域,而二叉树有两个
        self.lchild=None
        self.rchild=None

class Tree(object):
    """二叉树"""
    def __init__(self):
        self.root=None

    def add(self,item):
        node=Node(item)
        if self.root is None:
            self.root=node
            return
        queue=[self.root]
        while queue:
        #先从队列中取出一个节点

            cur_node=queue.pop(0)
            if cur_node.lchild is None:
                cur_node.lchild=node
                return
            else:
                queue.append(cur_node.lchild)

            if cur_node.rchild is None:
                cur_node.rchild=node
                return
            else:
                queue.append(cur_node.rchild)

    def breadth_trave(self):
        """广度遍历"""
        queue=[self.root]
        while queue:
            cur_node=queue.pop(0)
            print(cur_node.elem)
            if cur_node.lchild is not None:
                queue.append(cur_node.lchild)
            if cur_node.rchild is not None:
                queue.append(cur_node.rchild)

    def preorder(self,node):
        """先序遍历"""
        if node is None:
            return
        print(node.elem,end=" ")
        self.preorder(node.lchild)
        self.preorder(node.rchild)

    def inorder(self,node):
        """中序遍历"""
        if node is None:
            return
        self.inorder(node.lchild)
        print(node.elem, end=" ")
        self.inorder(node.rchild)

    def postorder(self,node):
        """后序遍历"""
        if node is None:
            return
        self.postorder(node.lchild)
        self.postorder(node.rchild)
        print(node.elem, end=" ")



if __name__=="__main__":
    tree=Tree()
    for i in range(9):
        tree.add(i)
    tree.breadth_trave()
    print(" ")
    tree.preorder(tree.root)
    print(" ")
    tree.inorder(tree.root)
    print(" ")
    tree.postorder(tree.root)

执行结果:
0
1
2
3
4
5
6
7
8
 
0 1 3 7 8 4 2 5 6  
7 3 8 1 4 0 5 2 6  
7 8 3 4 1 5 6 2 0 

课时60由遍历确定一颗二叉树

 只要有一个中序遍历,那么加上其他一个遍历就能确定一颗树。

因为中序,根是一定在中间的位置上的。只需要其他一个便利确定左右即可。

假设给定先序和中序。那么通过先序可知,根为0.

那么通过中序可以知道,【738194】一定是一颗树的左半部分。 

 那么同时又可以根据【738194】把先序给分成三部分。

因为不管则呢么样,【738194】一定是在一起的。

通过过这样,又找到了一个根【0】. 

由于1的左边是3,那么3就应该是1的左子根。

根据3这个子根,又可以分出7,8两个子根。

接着判断9。

从中序可以得出,既然1是根,那么9就应该是叶节点。同时,4应该是9的根。

那么最后,526也能确定。

 那么如何通过后序和中序来确定一颗树呢?

 

对于后序来说,根在最后的一部分,那么根应该是0

通过根来划分中序。 接着通过划分好的中序的部分来判断后序如何划分。

 

 对于每一个划分的部分,中序一定保持根在中间,后续一定保持根在最后。

所以可以得出。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值