zoukankan      html  css  js  c++  java
  • [二叉树] 二叉树的构造和遍历(基础)

    构造二叉树并加入节点


    class BiNode():
        def __init__(self,value=None,left=None,right=None):
            self.value=value
            self.left=left
            self.right=right
    class BiTree():
        def __init__(self,initial=None):
            #初始化对象BiTee()的时候必然为空
            self.TreeSet=initial
            
        def AddTree(self,TreeValue):
            #声明一个新的节点
            node=BiNode(TreeValue)
            
            if self.TreeSet is None:   #判断这棵树是否为空,是则把新节点加入树根
                self.TreeSet=node
            else:
                
                #通过que队列,把需要遍历的节点和子节点通通入队。每次迭代取出队首元素
                que=[]
                que.append(self.TreeSet) #把根节点装入que
                while que is not None:
                    ActNode=que.pop(0) #声明当前节点为队首元素
                    
                    if ActNode.left is None:
                        #左子树空则把新节点node加入TreeSet
                        ActNode.left=node
                        break
                    elif ActNode.right is None:
                        ActNode.right=node
                        break
                    else:
                        que.append(ActNode.left)
                        que.append(ActNode.right)
            print("OK")

    二叉树的广度遍历


    class BiNode():
        def __init__(self,value=None,left=None,right=None):
            pass
    class BiTree():
        def __init__(self,initial=None):
            pass
        #广度遍历
        def TraversalTree(self):
            ret=self.TreeSet
            que=[]
            que.append(ret)#入队根节点
    
            while len(que):
                actNode=que.pop(0)
                print(actNode.value)
                if actNode.left is not None:
                    que.append(actNode.left)
                if actNode.right is not None:
                    que.append(actNode.right)

    二叉树的前序遍历


     思路1(栈):

    假设节点P(非叶子节点)是二叉树中的某一个节点。对于这个节点

    1.访问根节点

    2.前序遍历左子树

    3.前序遍历右子树

     在while循环之前把head节点入栈了,那么while循环里面关注的就是子节点

    class BiNode():
        def __init__(self,value=None,left=None,right=None):
            pass
    class BiTree():
        def __init__(self,initial=None):
            self.TreeSet=initial
            
        def AddTree(self,TreeValue):
            pass
        def Pre_Order(self):
            head = self.TreeSet
            if not head:
                return None
            stack = [head]
            while len(stack):
                node = stack.pop()
                print(node.value)
                #先入栈右子树节点
                if node.right:
                    stack.append(node.right)
                #在入栈左子树节点
                if node.left:
                    stack.append(node.left)
    tree=BiTree()
    for x in range(11):
        tree.AddTree(x)
    print("ok")
    tree.Pre_Order()

    问题1:按照思路是前序遍历左子树 -> 前序遍历右子树 , 而代码为什么是 入栈右子树 -> 入栈左子树呢?

    想想栈的特点,入栈以右子树->左子树的顺序,才能实现出栈时左子树->右子树

     思路2(栈):

    1.沿着左子树一直到叶子节点,顺路把该节点的右子树节点入栈

    2.左子树到达叶子节点后开始出栈

    3.继续1和2

    class BiNode():
        def __init__(self,value=None,left=None,right=None):
            pass
    class BiTree():
        def __init__(self,initial=None):
            self.TreeSet=initial
            
        def AddTree(self,TreeValue):
            pass
        def pre_Order(self):
            head = self.TreeSet
            stack = []
            node = head
            while len(stack) or node:
                if node:
                    print(node.value)
                    stack.append(node.right)
                    node = node.left
                else:
                    #回溯条件:到达叶子节点
                    node = stack.pop()
    tree=BiTree()
    for x in range(11):
        tree.AddTree(x)
    print("ok")
    tree.pre_Order()

    二叉树的中序遍历


     思路1(栈):

    1.先遍历左节点直到叶子,因为 node = node.left,所以此时 node is None

    2.接着执行 else 分支,开始出栈(也就是回溯),把node指向右节点

    3.循环1,2

    注意当我们遍历左节点到叶子节点之后,执行else分支,node = node.right是None,不用担心,这时候会继续出栈(回溯),不影响。

    def in_Order(self):
        head = self.TreeSet
        stack = []
        node = head
        while len(stack) or node:
            if node:
                stack.append(node)
                node = node.left
            else:
                node = stack.pop()
                print(node.value)
                node = node.right

    思路2(递归):

    1.递归到叶子节点

    2.回溯过程中打印节点

    3.回溯过程中如果有右节点则递归右节点(重复1,2)

    def in_order_recursion(self,head):
        if head.left:
            self.in_order_recursion(head.left)
        print(head.value)
        if head.right:
            self.in_order_recursion(head.right)

    二叉树的后序遍历


    参考:https://blog.csdn.net/u012435142/article/details/89062177

     思路1(栈):

  • 相关阅读:
    创建类以及引用一个类
    修改hosts文件
    微信第三方登录接口开发
    Android定位
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 725. Split Linked List in Parts
    Leetcode 445. Add Two Numbers II
    Leetcode 328. Odd Even Linked List
    Leetcode 237. Delete Node in a Linked List
    Leetcode 234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/remly/p/10066266.html
Copyright © 2011-2022 走看看