c++二叉树先序遍历问题

2025-04-27 23:18:52
推荐回答(1个)
回答1:

//def.h
#define TRUE 1
#define OK 1
#define FLASE 0
#define ERROR 0

typedef int Status;
typedef char TElemType;

typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode, *BiTree;

Status CreateBiTree(BiTree &T);
Status AddBiTree(BiTree &T,TElemType e,char flag);
Status PreOrderTraverse(BiTree T,Status (* visit)(TElemType e));
Status InOrderTraverse(BiTree T,Status (* visit)(TElemType e));
Status PostOrderTraverse(BiTree T,Status (* visit)(TElemType e));
Status LevelOrderTraverse(BiTree T,Status (* visit)(TElemType e));
Status DepthTree(BiTree T);
//fun.cpp
#include "def.h"
#include 
#include 
using namespace std;

Status CreateBiTree(BiTree &T)
{
char s='s',l='l',r='r';
int n=1;
TElemType e;
cin>>e;
if(e == '^')T=NULL;
else 
{
if(!(T = (BiTNode *)malloc(sizeof(BiTNode)))) 
exit(-1);
T->data = e;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}

Status PreOrderTraverse(BiTree T,Status (* visit)(TElemType e))
{
if(T)
{
if(visit(T->data))
if(PreOrderTraverse(T->lchild,visit))
if(PreOrderTraverse(T->rchild,visit))
return OK;
return ERROR;
}
else return OK;
}

Status InOrderTraverse(BiTree T,Status (* visit)(TElemType e))
{
if(T->lchild != NULL)
{
InOrderTraverse(T->lchild,visit);
}
if(!visit(T->data))
return ERROR;
if(T->rchild != NULL)
{
InOrderTraverse(T->rchild,visit);
}
return OK;
}

Status PostOrderTraverse(BiTree T,Status (* visit)(TElemType e))
{
if(T->lchild != NULL)
{
PostOrderTraverse(T->lchild,visit);
}
if(T->rchild != NULL)
{
PostOrderTraverse(T->rchild,visit);
}
if(!visit(T->data))
return ERROR;
return OK;

}

Status LevelOrderTraverse(BiTree T,Status (* visit)(TElemType e))
{
    BiTree q[100];
q[0] = T;
int front = 0;
int rear = 1;
    while(front    {
        if(q[front])
        {
            if(!visit(q[front]->data))
return ERROR;
            q[rear++]=q[front]->lchild;
            q[rear++]=q[front]->rchild;
            front++;
        }
        else
        {
            front++;
        }
    }
return OK;
}

int DepthTree(BiTree T)
{
int dept=0;
if(T)
{
int Depth1 = DepthTree(T->lchild);
int Depth2 = DepthTree(T->rchild);
dept = Depth1>=Depth2?Depth1+1:Depth2+1;
}

return dept;
}
//main.cpp
#include "def.h"
#include 
using namespace std;

Status PrintElement(TElemType e)
{
cout<return OK;
}

void main()
{
BiTree T;
int Dept=1;
cout<<"请先序输入二叉树中结点的值: (输入'^'表示空结点)"< CreateBiTree(T);
cout< PreOrderTraverse(T,PrintElement);
cout< InOrderTraverse(T,PrintElement);
cout< PostOrderTraverse(T,PrintElement);
cout< LevelOrderTraverse(T,PrintElement);
cout< system("pause");
}

//////////////////////////上面是遍历///////////////////////////////


以前写的,创建的时候输入的值是按先序遍历的顺序;你可以测试123^^4^^2^^^^

搜索的话随便用一种遍历,访问所有非叶子节点,只要访问的节点的子节点为要搜索的节点,则该节点为其父节点;

第二个搜索大概意思是找到所有n

删除给定节点左右节点就把左右节点指针指向NULL;


实际我倒是觉得搜索和删除都没什么意义,掌握了遍历都ok