二叉树 —— 创建 + 先序、中序、后序遍历(递归+非递归)

创建如下二叉树:

代码如下

#coding:utf-8

class  Node(object):
    ‘‘‘构造节点‘‘‘
    def __init__(self,data=None,lchild=None,rchild=None):
        self.data = data
        self.lchild = lchild
        self.rchild = rchild

class Tree(object):

    def __init__(self):
        self.root = Node()

    def addNode(self,data):
        ‘‘‘利用队列构造树‘‘‘
        node = Node(data)
        if self.root.data == None:
            self.root = node
        else:
            myqueue =  []
            treeNode = self.root
            myqueue.append(treeNode)
            while myqueue:
                treeNode = myqueue.pop(0)
                if treeNode.lchild == None:
                    treeNode.lchild = node
                    return
                elif treeNode.rchild == None:
                    treeNode.rchild = node
                    return
                else:
                    myqueue.append(treeNode.lchild)
                    myqueue.append(treeNode.rchild)

    def  xianxu_digui(self,root):
        ‘‘‘利用递归实现先序遍历‘‘‘
        if root == None:
            return root
        else:
            print(root.data,end=‘ ‘)
            self.xianxu_digui(root.lchild)
            self.xianxu_digui(root.rchild)

    def front_stack(self, root):
        """利用栈实现二叉树的先序遍历"""
        if root == None:
            return
        mystack = []
        node = root
        while node or mystack:
            while node:  # 从根节点开始,一直找它的左子树
                print(node.data, end=‘ ‘)
                mystack.append(node)
                node = node.lchild
            node = mystack.pop()  #
            node = node.rchild  #

    def zhongxu_digui(self,root):
        ‘‘‘利用递归实现中序遍历‘‘‘
        if root == None:
            return root
        else:
            self.zhongxu_digui(root.lchild)
            print(root.data,end=‘ ‘)
            self.zhongxu_digui(root.rchild)

    def midd_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.data, end=‘ ‘)
            node = node.rchild

    def houxu_digui(self,root):
        ‘‘‘利用递归实现后序遍历‘‘‘
        if root == None:
            return
        else:
            self.houxu_digui(root.lchild)
            self.houxu_digui(root.rchild)
            print(root.data,end=‘ ‘)

    def later_stack(self, root):
        """利用栈实现后序遍历"""
        if root == None:
            return
        mystack1 = []  # mystack1 这是一个中介栈,目的是调整进mystack2 栈的顺序。
        mystack2 = []  #该栈里面的元素是 逆序的倒序,逐个弹出,访问
        node = root
        mystack1.append(node)
        while mystack1:
            node = mystack1.pop()
            mystack2.append(node)
            if node.lchild:
                mystack1.append(node.lchild)
            if node.rchild:
                mystack1.append(node.rchild)

        while mystack2:  # 将mystack2中的元素逐个弹出,即为后序遍历次序
            print(mystack2.pop().data,end=‘ ‘)

    def leve_queue(self,root):
        ‘‘‘按层遍历‘‘‘
        if root == None:
            return
        else:
            myqueue = []
            node = root
            myqueue.append(root)
            while myqueue:
                node = myqueue.pop(0)
                print(node.data,end=‘ ‘)
                if node.lchild:
                    myqueue.append(node.lchild)
                if node.rchild:
                    myqueue.append(node.rchild)

tree = Tree()
tree.addNode(1)
tree.addNode(2)
tree.addNode(3)
tree.addNode(4)
tree.addNode(5)
tree.addNode(6)
tree.addNode(7)
tree.addNode(8)
tree.addNode(9)
tree.addNode(10)
#
print(‘先序遍历‘)
tree.xianxu_digui(tree.root)
print(‘\n‘)
tree.front_stack(tree.root)
print(‘\n‘)
print(‘中序遍历 ‘)
tree.zhongxu_digui(tree.root)
print(‘\n‘)
tree.midd_stack(tree.root)
print(‘\n‘)
print(‘后序遍历‘)
tree.houxu_digui(tree.root)
print(‘\n‘)
tree.later_stack(tree.root)
print(‘\n‘)
print(‘层次遍历‘)
tree.leve_queue(tree.root)

时间: 2024-10-07 18:49:56

二叉树 —— 创建 + 先序、中序、后序遍历(递归+非递归)的相关文章

数据结构:二叉树(前,中,后,层次)非递归遍历。

#include <iostream> #include <stack> #include <map> #include <queue> #include <string.h> using namespace std; struct Node { char data; Node *left; Node *right; Node(char d = char()):data(d),left(NULL),right(NULL){} }; class T

Java数据结构四之——二叉树的前、中、后序遍历

程序来自Program Creek 前 Preorder binary tree traversal is a classic interview problem about trees. The key to solve this problem is to understand the following: What is preorder? (parent node is processed before its children) Use Stack from Java Core lib

二叉树遍历算法——包含递归前、中、后序和层次,非递归前、中、后序和层次遍历共八种

首先,要感谢网上的参考资料. http://mengliao.blog.51cto.com/876134/1178079(作者:BlackAlpha) http://blog.csdn.net/fzh1900/article/details/14056735(作者:_云淡风轻) http://blog.csdn.net/stpeace/article/details/8138458(作者:stpeace) 二叉树是使用的比较广泛的一种数据结构,这里我写了二叉树的相关操作,包括初始化.新建.以及遍

二叉树高度,以及栈实现二叉树的先序,中序,后序遍历的非递归操作

求解二叉树的高度 树是递归定义的,所以用递归算法去求一棵二叉树的高度很方便. #include <iostream> #include <cstdio> using namespace std; struct Node { char data; Node *lchild; Node *rchild; }; void High(Node *T, int &h) { if (T == NULL) h = 0; else { int left_h; High(T->lchi

二叉树基本操作续二:前序、中序、后序遍历(非递归 迭代方式)

这里给出二叉树三种遍历方式的迭代实现代码.二叉树的递归实现使用系统栈入栈出栈,而非递归的迭代实现方法就是手动维护一个栈,来模拟递归的入栈出栈过程. 本文没有给出用户栈的代码,如果需要结合上篇的测试代码一起测试,则需要自己实现自己的栈,以及基本的pop.push等栈操作函数. 前序迭代遍历: 1 void iter_preorder(tree_pointer ptr) 2 { 3 //前序遍历:先遍历根节点,然后再分别遍历左右子树 4 int top = -1; 5 tree_pointer st

华南理工数据结构大作业第二题 二叉树各种操作深度结点个数后序前序中序层次求祖先

/*#include<iostream> #include<windows.h> using namespace std ; struct BTNode { char data ; BTNode *left ; BTNode *right ; BTNode () { left = NULL ; right = NULL ; } } ; int main () { cout <<"题目所给的二叉树用括号表示法后表示为:A(B(D,E(H(J,K(L,M(,N))

二叉树非递归先中后序遍历 及 非递归交换二叉树两个孩子的位置

看到一个非递归交换一个二叉树的左右孩子的位置,于是想实现之,才发现非递归的先中后序遍历都忘记了……于是杂七杂八的写了一些,抄抄资料就实现了,然后实现非递归交换两个孩子的位置还是相当容易的.先直接上代码吧,其实这东西还是得自己写写过一遍的,印象才会更加深刻: #include <iostream> #include <fstream> #include <string> #include <stack> using std::cout; using std::

算法进化历程之“根据二叉树的先序和中序序列输出后序序列”

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 前不久在看到一个作业"根据二叉树的先序和中序序列输出后序序列",当时我参考<数据结构与算法(C语言)习题集>上的做法,先根据先中序序列确定一颗二叉树,然后后序遍历二叉树输出后序序列. 函数采用了递归算法,利用函数传入的先序和中序序列的左右边界,确定要处理的序列段,生成相应的二叉树. 基本思路是,把该段先序序列的第一个元素作为当前二叉树的根结点,然后在中序序列找到根结点.根结点

二叉树前序、中序和后序遍历的非递归实现

1 二叉树的前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 2 二叉树的中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中间访问,所以是中序遍历. 3 二叉树的后序遍历 对于每棵子树,先处理左子树,然后处理右子树,最后处理根.根最后访问,所以是后序遍历. 4 二叉树后序遍历的非递归实现 如果pre为NULL: 左右儿子都是NULL,那么自己出栈: 如果左儿子为NULL,右儿子不为NULL,右儿子进栈: 如果左儿子不为NULL,那

通过二叉树的中序序列和后序序列获取前序序列

二叉树的遍历方式常见的三种是:先序遍历(ABC).中序遍历(BAC).后序遍历(BCA) 先序遍历: 若二叉树为空,则空操作:否则: 访问根结点; 先序遍历左子树: 先序遍历右子树. 中序遍历: 若二叉树为空,则空操作:否则: 中序遍历左子树: 访问根结点: 中序遍历右子树. 后序遍历: 若二叉树为空,则空操作:否则: 后序遍历左子树: 后序遍历右子树: 访问根结点. 在学习到 根据遍历序列确定二叉树 时,知道了:可以通过二叉树的先中或者中后遍历序列唯一确定一棵二叉树. 根据算法描述 使用jav