c++ c 树-不用栈的非递归二叉树遍历 求改正 (C++新手)

问题描述

不用栈的非递归二叉树遍历 求改正 (C++新手)
原程序如下,添加了双亲域parent和标志域mark;不知道哪里不对:

#include""iostream""
using namespace std;
class BinTree;

class BinNode
{
private:
int data;

BinNode *lchild;BinNode *rchild;BinNode *parent;int mark;friend class BinTree;

};

class BinTree
{
private:
BinNode *root;

public:
BinTree()
{
root=0;
}

BinNode *Get_Root(){    return root;}BinNode *Create_Tree(BinNode *r)    //先序建立二叉树{    int d;    cout<<""输入数据(0代表空):"";    cin>>d;    if(d==0)        return NULL;    else    {        r=new BinNode;        r->data=d;        r->lchild=Create_Tree(r->lchild);        r->rchild=Create_Tree(r->rchild);    }    root=r;    return r;}void InOrder_rec1(BinNode *p)   //xian序遍历{    if(p)    {        cout<<p->data<<""  "";        InOrder_rec1(p->lchild);        InOrder_rec1(p->rchild);    }}void InOrder_rec2(BinNode *p)   //中序遍历{    if(p)    {        InOrder_rec2(p->lchild);        cout<<p->data<<""  "";        InOrder_rec2(p->rchild);    }}void PostOrder_rec(BinNode *p)//后续遍历{    BinNode*t=p;    t->mark=0;    while (t)    {        switch(t->mark){        case 0:            t->mark=1;            if(t->lchild) t=t->lchild;            break;        case 1:            t->mark=2;            if(t->rchild) t=t->rchild;        case 2:            cout<<t->data<<endl;            t->mark=0;            t=t->parent;            break;                default:;         }    }}

};

int main()
{
BinTree tree;
BinNode *p=NULL;
p=tree.Create_Tree(p);

cout<<""先序遍历二叉树:"";tree.InOrder_rec1(p);cout<<endl;cout<<""中序遍历二叉树:"";tree.InOrder_rec2(p);cout<<endl;cout<<""中序遍历二叉树:"";tree.PostOrder_rec(p);cout<<endl;

}

解决方案

#include""iostream""using namespace std;class BinTree;class BinNode{private:    int data;    BinNode *lchild;    BinNode *rchild;    BinNode *parent;    int mark;    friend class BinTree;};class BinTree{private:    BinNode *root;public:    BinTree()    {        root=0;    }    BinNode *Get_Root()    {        return root;    }    BinNode *Create_Tree(BinNode *r)    //先序建立二叉树    {        int d;        cin>>d;        if(d==0)            return NULL;        else        {            r=new BinNode;            r->data=d;            r->lchild=Create_Tree(r->lchild);            r->rchild=Create_Tree(r->rchild);        }        root=r;        return r;    }    void InOrder_rec1(BinNode *p)   //xian序遍历    {        if(p)        {            cout<<p->data<<""  "";            InOrder_rec1(p->lchild);            InOrder_rec1(p->rchild);        }    }    void InOrder_rec2(BinNode *p)   //中序遍历    {        if(p)        {            InOrder_rec2(p->lchild);            cout<<p->data<<""  "";            InOrder_rec2(p->rchild);        }    }    void PostOrder_rec(BinNode *p)//后序遍历    {        if(p)        {            InOrder_rec2(p->lchild);            InOrder_rec2(p->rchild);            cout<<p->data<<""  "";        }    }};int main(){    BinTree tree;    BinNode *p=NULL;    cout<<""输入数据(0代表空):"";    p=tree.Create_Tree(p);    cout<<""先序遍历二叉树:"";    tree.InOrder_rec1(p);    cout<<endl;    cout<<""中序遍历二叉树:"";    tree.InOrder_rec2(p);    cout<<endl;    cout<<""后序遍历二叉树:"";    tree.PostOrder_rec(p);    cout<<endl;}
时间: 2024-12-05 03:29:13

c++ c 树-不用栈的非递归二叉树遍历 求改正 (C++新手)的相关文章

非递归二叉树遍历-c语言中函数指针作为参数与函数的嵌套

问题描述 c语言中函数指针作为参数与函数的嵌套 函数指针作为另一函数的参数和函数的嵌套的区别,感觉都是调用,有什么不一样呢?他们都适用在什么情况下!(我是在学非递归遍历二叉树时看到的) Status Visit(TElemType e){ printf("%cn",e); return OK; } Status InOrderTraverse(BiTree T ,Status(*Visit)(TElemType e)){ SqStack S; InitStack(S); Push(S,

C语言实现二叉树的常用的算法(递归与非递归实现遍历)

队列头文件: #include <stdio.h> #include "BinaryTree.h" // // 队列头文件:Queue.h #ifndef QUEUE_H #define QUEUE_H // // 队列最大元素个数 #define MAX_QUEUE_SIZE 10 typedef BTree QueueElemType; // // 队列结构体 typedef struct tagQueue { BTree *base; int front; // 头指

文件夹复制操作(非递归循环遍历文件夹)

/// <summary> /// 创建文件夹 /// </summary> /// <param name="SourcePath">原始路径</param> /// <returns></returns> public static bool CreateFolder(string SourcePath) { try { Directory.CreateDirectory(SourcePath); return

二叉树递归和非递归遍历

二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的).下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍历方式的非递归实现. 一.三种遍历方式的递归实现(比较简单,这里不详细讲解) 1.先序遍历--按照"根节点-左孩子-右孩子"的顺序进行访问. vo

C++非递归队列实现二叉树的广度优先遍历_C 语言

本文实例讲述了C++非递归队列实现二叉树的广度优先遍历.分享给大家供大家参考.具体如下: 广度优先非递归二叉树遍历(或者说层次遍历): void widthFirstTraverse(TNode* root) { queue<TNode*> q; // 队列 q.enqueue(root); TNode* p; while(q.hasElement()) { p = q.dequeue(); // 队首元素出队列 visit(p); // 访问p结点 if(p->left) q.enqu

二叉搜索树与树的遍历非递归练习

复习了二叉搜索树的实现,包括插入.查找和删除操作,顺便做了下二叉树的三种遍历操作.全部操作采用非递归方式.   #include<iostream>   #include<stack>   using namespace std;     typedef int T;   // 值类型      // 节点定义    struct node {       T val;       node *left,*right;       node(const T& val):va

中序遍历二叉树-二叉树的非递归操作。。

问题描述 二叉树的非递归操作.. 如何用栈实现二叉树的非递归操作,越详细越好,谢谢各位啦.一定要详细哦 解决方案 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<<

深入理解二叉树的非递归遍历_C 语言

二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁.而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现.在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点.一.前序遍历前序遍历按照"根结点-左孩子-右孩子"的顺序进行访问.1.递归实现 复制代码 代码如下: void preO

深入遍历二叉树的各种操作详解(非递归遍历)_C 语言

先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序.中序.后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组队列,分别使用了front和rear两个数组的下标来表示入队与出队,还有两个操作就是求二叉树的深度.结点数... 复制代码 代码如下: #include<iostream>#include<queue>#include<stack>using namespace std;/