设为首页 加入收藏

TOP

二叉链表表示的二叉树和一些基本操作(二)
2015-11-10 13:45:15 来源: 作者: 【 】 浏览:3
Tags:表示 一些 基本操作
e (!sta.empty()){
? ? ? ? while (p = sta.top())sta.push(p->lchild);
? ? ? ? sta.pop();
? ? ? ? if (!sta.empty()){
? ? ? ? ? ? p = sta.top();
? ? ? ? ? ? sta.pop();
? ? ? ? ? ? if (!Visit(p))return ERROR;
? ? ? ? ? ? sta.push(p->rchild);
? ? ? ? }
? ? }
? ? return OK;
}


Status InOrderTraverse_3(BiTree T, Status(*Visit)(BiTree))
//采用二叉链表储存结构,Visit是对数据元素操作的应用函数。
//中序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit
{
? ? stack sta;
? ? BiTree p = T;
? ? while (p || !sta.empty()){
? ? ? ? if (p){ sta.push(p); p = p->lchild; }
? ? ? ? else{
? ? ? ? ? ? p = sta.top();
? ? ? ? ? ? sta.pop();
? ? ? ? ? ? if (!Visit(p))return ERROR;
? ? ? ? ? ? p = p->rchild;
? ? ? ? }
? ? }
? ? return OK;
}


Status PostOrderTraverse(BiTree T, Status(*Visit)(BiTree))
//T表示这个树的根节点的指针
//采用二叉链表储存结构,Visit是对结点操作的对应函数
//后序遍历二叉树T,对每个结点调用函数Visit一次且仅一次。
//一旦visit()失败,则操作失败
{
? ? if (T){
? ? ? ? BiTree lchild = T->lchild, rchild = T->rchild;
? ? ? ? if (PostOrderTraverse(lchild, Visit))
? ? ? ? if (PostOrderTraverse(rchild, Visit))
? ? ? ? if (Visit(T))return OK;
? ? ? ? return ERROR;
? ? }
? ? return OK;
}


Status LevelOrderTraverse(BiTree T, Status(*Visit)(BiTree))
//T表示这个树的根节点的指针
//采用二叉链表储存结构,Visit是对结点操作的对应函数
//层序遍历二叉树T,对每个结点调用函数Visit一次且仅一次。
//一旦visit()失败,则操作失败
{
? ? deque deq;
? ? if (T){
? ? ? ? deq.push_back(T);
? ? ? ? while (!deq.empty()){
? ? ? ? ? ? auto temp? = deq.at(0);
? ? ? ? ? ? Visit(temp);
? ? ? ? ? ? if (temp->lchild)
? ? ? ? ? ? ? ? deq.push_back(temp->lchild);
? ? ? ? ? ? if (temp->rchild)
? ? ? ? ? ? ? ? deq.push_back(temp->rchild);
? ? ? ? ? ? deq.pop_front();
? ? ? ? }
? ? }
? ? cout << endl;
? ? return OK;
}


Status DestroyBiTree(BiTree &T)
//摧毁二叉树T
{
? ? if (PreOrderTraverse(T, Destroy))return OK;
? ? return FALSE;
}


主函数


// 二叉链表.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"


?



int _tmain(int argc, _TCHAR* argv[])
{
? ? BiTree T;
? ? cout << "中序输入二叉树,如果某个节点的左右子树为空,则输入两个空格:" << endl;
? ? CreateBiTree(T);
? ? cout << "先序遍历" << endl;
? ? PreOrderTraverse(T, VisitBiTree);
? ? cout << endl;
? ? cout << "中序遍历"<? ? InOrderTraverse(T, VisitBiTree);
? ? cout << endl;
? ? InOrderTraverse_2(T, VisitBiTree);
? ? cout << endl;
? ? InOrderTraverse_3(T, VisitBiTree);
? ? cout << endl;
? ? cout << "后序遍历"<? ? PostOrderTraverse(T, VisitBiTree);
? ? cout << endl;
? ? cout << "层序遍历"<? ? LevelOrderTraverse(T, VisitBiTree);
? ? DestroyBiTree(T);
? ? return 0;
}


结果:(在vs2013中实现,注意要在stadfx.h中包含相应的头文件)



首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java工具类之Graphics 下一篇J2EE之Filter使用实例(页面跳转)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: