二叉树几种遍历算法

<span style="font-size:14px;">/*二叉树的遍历*/

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;

typedef struct node
{
    char data;
    struct node *lchild,*rchild;
}BinTree;

typedef struct node1
{
    BinTree *btnode;
    bool isFirst;
}BTNode;

void creatBinTree1(BinTree* &root) //前序遍历创建树,形如 A,B,C,#,#,D,#,#,E,#,#
{
    char value;
    cin>>value;
    if(value == '#') root = NULL; //递归结束条件
    else
    {
        root = (BinTree *)malloc(sizeof(BinTree));
        root->data = value;
        creatBinTree1(root->lchild);
        creatBinTree1(root->rchild);
    }
}

void creatBinTree2(char *s,BinTree *&root)  //创建二叉树,s为形如A(B,C(D,E))形式的字符串
{
    int i;
    bool isRight=false;
    stack<BinTree*> s1;          //存放结点
    stack<char> s2;              //存放分隔符
    BinTree *p,*temp;
    root->data=s[0];
    root->lchild=NULL;
    root->rchild=NULL;
    s1.push(root);
    i=1;
    while(i<strlen(s))
    {
        if(s[i]=='(')
        {
            s2.push(s[i]);
            isRight=false;
        }
        else if(s[i]==',')
        {
            isRight=true;
        }
        else if(s[i]==')')
        {
            s1.pop();
            s2.pop();
        }
        else if(isalpha(s[i]))
        {
            p=(BinTree *)malloc(sizeof(BinTree));
            p->data=s[i];
            p->lchild=NULL;
            p->rchild=NULL;
            temp=s1.top();
            if(isRight==true)
            {
                temp->rchild=p;
                cout<<temp->data<<"的右孩子是"<<s[i]<<endl;
            }
            else
            {
                temp->lchild=p;
                cout<<temp->data<<"的左孩子是"<<s[i]<<endl;
            }
            if(s[i+1]=='(')
                s1.push(p);
        }
        i++;
    }
}

void display(BinTree *root)        //显示树形结构
{
    if(root!=NULL)
    {
        cout<<root->data;
        if(root->lchild!=NULL)
        {
            cout<<'(';
            display(root->lchild);
        }
        if(root->rchild!=NULL)
        {
            cout<<',';
            display(root->rchild);
            cout<<')';
        }
    }
}

void preOrder1(BinTree *root)     //递归前序遍历
{
    if(root!=NULL)
    {
        cout<<root->data<<" ";
        preOrder1(root->lchild);
        preOrder1(root->rchild);
    }
}

void inOrder1(BinTree *root)      //递归中序遍历
{
    if(root!=NULL)
    {
        inOrder1(root->lchild);
        cout<<root->data<<" ";
        inOrder1(root->rchild);
    }
}

void postOrder1(BinTree *root)    //递归后序遍历
{
    if(root!=NULL)
    {
        postOrder1(root->lchild);
        postOrder1(root->rchild);
        cout<<root->data<<" ";
    }
}

void preOrder2(BinTree *root)     //非递归前序遍历
{
    stack<BinTree*> s;
    BinTree *p=root;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)
        {
            cout<<p->data<<" ";
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty())
        {
            p=s.top();
            s.pop();
            p=p->rchild;
        }
    }
}

void inOrder2(BinTree *root)      //非递归中序遍历
{
    stack<BinTree*> s;
    BinTree *p=root;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)
        {
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty())
        {
            p=s.top();
            cout<<p->data<<" ";
            s.pop();
            p=p->rchild;
        }
    }
}

void postOrder2(BinTree *root)    //非递归后序遍历
{
    stack<BTNode*> s;
    BinTree *p=root;
    BTNode *temp;
    while(p!=NULL||!s.empty())
    {
        while(p!=NULL)              //沿左子树一直往下搜索,直至出现没有左子树的结点
         {
            BTNode *btn=(BTNode *)malloc(sizeof(BTNode));
            btn->btnode=p;
            btn->isFirst=true;
            s.push(btn);
            p=p->lchild;
        }
        if(!s.empty())
        {
            temp=s.top();
            s.pop();
            if(temp->isFirst==true)     //表示是第一次出现在栈顶
             {
                temp->isFirst=false;
                s.push(temp);
                p=temp->btnode->rchild;
            }
            else                        //第二次出现在栈顶
             {
                cout<<temp->btnode->data<<" ";
                p=NULL;
            }
        }
    }
}

void postOrder3(BinTree *root)     //非递归后序遍历
{
    stack<BinTree*> s;
    BinTree *cur;                      //当前结点
    BinTree *pre=NULL;                 //前一次访问的结点
    s.push(root);
    while(!s.empty())
    {
        cur=s.top();
        if((cur->lchild==NULL&&cur->rchild==NULL)||
           (pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
        {
            cout<<cur->data<<" ";  //如果当前结点没有孩子结点或者孩子节点都已被访问过
              s.pop();
            pre=cur;
        }
        else
        {
            if(cur->rchild!=NULL)
                s.push(cur->rchild);
            if(cur->lchild!=NULL)
                s.push(cur->lchild);
        }
    }
}

void postOrder4(BinTree *root) //非递归后序遍历
{
	stack<BinTree *> stack_tree;
	BinTree *t = root;
	BinTree *t_1 = NULL;

	while(t || !stack_tree.empty()) {
		while(t) {
			stack_tree.push(t);
			t = t->lchild;
		}
		if(!stack_tree.empty()) {
			t = stack_tree.top();
			if(t_1 != t && t->rchild) { //t_1 == t 时,说明第二次访问栈中的元素
				t_1 = t;
				t = t->rchild;
			}else {
				cout<<"val = "<<stack_tree.top()->data<<endl;
				stack_tree.pop();
				t = NULL;
			}
		}
	}
}

int main(int argc, char *argv[])
{
    char s[100];
    while(scanf("%s",s)==1)
    {
        BinTree *root=(BinTree *)malloc(sizeof(BinTree));
        creatBinTree2(s,root);
        display(root);
        cout<<endl;
        preOrder2(root);
        cout<<endl;
        inOrder2(root);
        cout<<endl;
        postOrder2(root);
        cout<<endl;
        postOrder3(root);
        cout<<endl;
    }
    return 0;
}
</span>

时间: 2024-10-05 04:58:39

二叉树几种遍历算法的相关文章

二叉树几种遍历算法的非递归实现

二叉树遍历的非递归实现 相对于递归遍历二叉树,非递归遍历显得复杂了许多,但换来的好处是算法的时间效率有了提高.下面对于我学习非递归遍历二叉树算法的过程进行总结 为了便于理解,这里以下图的二叉树为例,分析二叉树的三种遍历方式的实现过程. 一.非递归实现二叉树的前序遍历 不借助递归,要实现二叉树的前序遍历,我们需要用到前面学过的栈这种数据结构.根据前序遍历的定义,先访问根节点,再访问左子树,最后访问右子树.声明指向节点的指针pCur,我们可以先访问根节点,之后让根节点进栈,并让pCur在左子树上移动

二叉树三种遍历算法的递归和非递归实现(C++)

struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; //递归前序遍历 void PreOrder(BinaryTreeNode* pNode) { if(pNode!=NULL) { cout<<pNode->m_nValue<<endl; PreOrder(pNode->m_pLeft); PreOrder(pNode->m_pRi

数据结构 《22》---- 二叉树三种遍历的迭代器算法

二叉树的三种遍历有递归版本,和迭代版本.本文介绍一种新的思路. 参考了 http://coolshell.cn/articles/9886.html 在许多应用中,我们还需要对遍历本身进行抽象.假如有一个求和的函数sum,我们希望它能应用于链表,数组,二叉树等等不同的数据结构.这时,我们可以抽象出迭代器(Iterator)的概念,通过迭代器把算法和数据结构解耦了,使得通用算法能应用于不同类型的数据结构. 以下给出了三种遍历的迭代器算法. class Iterator { public: virt

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

二叉树三种遍历非递归算法

http://blog.csdn.net/pipisorry/article/details/37353037 c实现: 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; } SqStack; void PreOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { w

二叉树三种遍历递归及非递归实现(Java)

import java.util.Stack; //二叉树三种遍历递归及非递归实现(Java) public class Traverse { /******************定义二叉树**************************/ private final int MAX_SIZE = 10; //链式存储 public static class BinaryTreeNode { int mValue; BinaryTreeNode mLeft; BinaryTreeNode

二叉树的各种遍历算法-leetcode Binary Tree Postorder Traversal 扩展

二叉树的各种遍历方法有  前序遍历   中序遍历    后序遍历  层序遍历.其中前三种遍历有递归程序可以实现,但是我们也有必要掌握其非递归版本的算法实现.正好在leetcode中遇到了遍历二叉树的问题,今天在这里一并总结了. 首先,引用leetcode中关于二叉树节点的定义. 1 // Definition for binary tree 2 struct TreeNode { 3 int val; 4 TreeNode *left; 5 TreeNode *right; 6 TreeNode

关于二叉树三种遍历的相互推导

嗯..跟着陈越姥姥上数据结构,期末考试遇到一道从后序遍历和中序遍历推前序遍历的题,然后硬是不会做,今天突然有了思路,遂记下来: 原题是这样的:一颗二叉树的后序遍历序列是FDEBGCA,中序遍历序列是FDBEACG,那么前序遍历序列是? 思路如下: 根据后序遍历的性质,最后访问的元素一定是根节点,可知该二叉树根节点为A: 根据中序遍历的性质,出现在A前面的一定是A的左子树里面的节点,出现在A后面的一定是A右子树里面的节点.那么我们现在可以确定FDBE一定是A的左子树,CG一定是A的右子树: 根据树

二叉树后序遍历算法实现

对于二叉树的三种遍历方式,它们的难易程度是不一样的,最简单的是先序遍历,其次是中序遍历,最难的是后序遍历方式.但是最难的后序遍历方式,却可以通过最简单的先序遍历方式的变形实现,然后把遍历的结果逆序一下就搞定了.哈哈,物极必反啊! 先看一个最简单的后序的遍历方法的实现,利用先序遍历方式的变形,然后逆序 vector<int> PostOrder(TreeNode *root) { vector<int> result; stack<const TreeNode*> s;