二叉树中的七种遍历

1、题目描述:二叉树的构建、深度遍历(6种)、层次遍历

# -*- coding: utf-8 -*-
"""
Created on Tue Jun 19 10:31:40 2018

@author: Administrator
"""
class  Node():
    def __init__(self,elem=-1,lchild=None,rchild=None):
        self._elem=elem
        self._lchild=lchild
        self._rchild=rchild
        
class BinaryTree():
    def __init__(self):
        self._root=Node()
        self._myQueue=[]
        
    def add(self,elem):#为树添加节点
        node=Node(elem)
        if self._root._elem==-1:#如果树是空的,则对根节点赋值
            self._root=node
            self._myQueue.append(self._root)
        else:
            treeNode=self._myQueue[0]
            if treeNode._lchild==None:
                treeNode._lchild=node
                self._myQueue.append(treeNode._lchild)
            else:
                treeNode._rchild=node
                self._myQueue.append(treeNode._rchild)
                self._myQueue.pop(0)#用于叶节点的子节点增加(层次)
        
    def front_digui(self,root):#先序递归
        if root==None:
            return 
        print (root._elem)
        self.front_digui(root._lchild)
        self.front_digui(root._rchild)
    
    def middle_digui(self,root):#中序递归
        if root==None:
            return 
        self.middle_digui(root._lchild)
        print(root._elem)
        self.middle_digui(root._rchild)
        
    def later_digui(self,root):#后序递归
        if root==None:
            return 
        self.later_digui(root._lchild)
        self.later_digui(root._rchild)
        print(root._elem)
        
        
    def front_stack(self,root):#先序非递归(堆栈)
        #第一次经过,压栈,访问,取其左
        #第二次经过,出栈,取其右
        if root==None:
            return
        myStack=[]
        node=root
        while node or myStack:
            while node:               
                myStack.append(node)
                print (node._elem)
                node=node._lchild
            node=myStack.pop()
            node=node._rchild
    
        
    def middle_stack(self,root):#中序非递归(堆栈)
        #第一次经过,压栈,取其左
        #第二次经过,出栈,访问,取其右
        if root==None:
            return
        myStack=[]
        node=root
        while node or myStack:
            while node:
                myStack.append(node)
                node=node._lchild
            node=myStack.pop()
            print (node._elem)
            node=node._rchild
       
    def later_stack(self,root):#后序非递归(两个堆栈)
        if root==None:
            return 
        myStack1=[]
        myStack2=[]
        node=root
        myStack1.append(node)
        while myStack1:#这个while循环的功能是找出后序遍历的逆序,存在myStack2里面
            node=myStack1.pop()#这个列表相当于栈
            if node._lchild:
                myStack1.append(node._lchild)
            if node._rchild:
                myStack1.append(node._rchild)
            myStack2.append(node)
        while myStack2:#将myStack2中的元素出栈,即为后序遍历次序
            print (myStack2.pop()._elem)
        
    def level_queue(self,root):#层次遍历
        result=[]
        if root==None:
            return result
        myQueue=[]
        node=root
        myQueue.append(node)
        while myQueue:
            node=myQueue.pop(0)#这个列表相当于队列
            #print (node._elem)
            result.append(node._elem)
            if node._lchild:
                myQueue.append(node._lchild)
            if node._rchild:
                myQueue.append(node._rchild)
        return result
                
tree=BinaryTree()   
for i in range(5):
    tree.add(i)             
#tree.front_digui(tree._root)
#tree.middle_digui(tree._root)
#tree.later_digui(tree._root)

#tree.front_stack(tree._root)
#tree.middle_stack(tree._root)
#tree.later_stack(tree._root)

a=tree.level_queue(tree._root)
print (a)
3、总结:深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过递归和迭代两种方式实现二叉树的三种遍:前序遍序遍和后序遍。 1. 前序遍(Preorder Traversal):访问根节点,然后按照先左子树后右子树的顺序递归遍左右子树。 递归实现: ```java public void preOrderTraversal(Node root) { if (root != null) { System.out.print(root.data + " "); // 访问根节点 preOrderTraversal(root.left); // 递归遍左子树 preOrderTraversal(root.right); // 递归遍右子树 } } ``` 2. 序遍(Inorder Traversal):先递归遍左子树,然后访问根节点,最后递归遍右子树。 递归实现: ```java public void inOrderTraversal(Node root) { if (root != null) { inOrderTraversal(root.left); // 递归遍左子树 System.out.print(root.data + " "); // 访问根节点 inOrderTraversal(root.right); // 递归遍右子树 } } ``` 3. 后序遍(Postorder Traversal):先递归遍左子树,然后递归遍右子树,最后访问根节点。 递归实现: ```java public void postOrderTraversal(Node root) { if (root != null) { postOrderTraversal(root.left); // 递归遍左子树 postOrderTraversal(root.right); // 递归遍右子树 System.out.print(root.data + " "); // 访问根节点 } } ``` 以上是递归实现方式,也可以使用迭代的方式实现二叉树的遍,用栈来辅助实现。在遍过程,将节点放入栈,然后按照一定顺序弹出节点进行操作,直到栈为空。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值