二叉树的基本操作
来源:互联网 发布:手机无线网络限速软件 编辑:程序博客网 时间:2024/05/29 19:02
二叉树的基本操作,包括递归和非递归遍历
// 面试题6-1.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <malloc.h>#include <stack> //栈: 先中后遍历非递归#include <queue> //队列:层次遍历typedef struct BiTNode {intdata;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;/*************二叉树基本操作***************///创建二叉树的单结点BiTNode* CreateBiTNode(int value){BiTNode* pNode = (BiTNode*) malloc(sizeof(BiTNode));pNode->data = value;pNode->lchild = NULL;pNode->rchild = NULL;return pNode;}//连接结点void ConnectBiTNode(BiTNode* parent, BiTNode* pLeft, BiTNode* pRight){if(parent == NULL)return;parent->lchild = pLeft;parent->rchild = pRight;}//打印单个结点void PrintBiTNode(BiTNode* pNode){if(pNode == NULL){printf("this node is null.\n");return;}printf("the value of the node is %d\n", pNode->data);if(pNode->lchild != NULL)printf("the left child of the node is %d\n", pNode->lchild->data);elseprintf("the left child of the node is null\n");if(pNode->rchild != NULL)printf("the right child of the node is %d\n", pNode->rchild->data);elseprintf("the right child of the node is null\n");printf("\n");}void VisitData(BiTNode* pNode){if(pNode != NULL){printf("%d ", pNode->data);}}//遍历二叉树//1.先序遍历(递归)void PreOderTraverse(BiTNode* pRoot){if(pRoot != NULL){ PrintBiTNode(pRoot);//if(pRoot->lchild != NULL)PreOderTraverse(pRoot->lchild);//if(pRoot->rchild != NULL)PreOderTraverse(pRoot->rchild);}}//2.中序遍历(递归)void InOderTraverse(BiTNode* pRoot){if(pRoot != NULL){InOderTraverse(pRoot->lchild);PrintBiTNode(pRoot);InOderTraverse(pRoot->rchild);}}//3.后续遍历(递归)void PostOderTraverse(BiTNode* pRoot){if(pRoot != NULL){PostOderTraverse(pRoot->lchild);PostOderTraverse(pRoot->rchild);PrintBiTNode(pRoot);}}//1.先序遍历(非递归)void PreOderTraverse1(BiTNode* pRoot){std::stack<BiTNode*> pNode;BiTNode* p = pRoot;while(p != NULL || !pNode.empty()){while(p != NULL) //遍历左子树{VisitData(p); pNode.push(p);p = p->lchild;}if(!pNode.empty()){p = pNode.top();p = p->rchild;pNode.pop();}}}//2.中序遍历(非递归)void InOderTraverse1(BiTNode* pRoot){std::stack<BiTNode*> pNode;pNode.push(pRoot); //根指针入栈BiTNode* p = pRoot;while(!pNode.empty()) {while(pNode.top() != NULL && p != NULL) //向左走到尽头,最后一个入栈的是一个NULL指针{p = p->lchild;pNode.push(p);}pNode.pop(); //栈顶的空指针出栈if(!pNode.empty()){p = pNode.top(); //栈顶元素//PrintBiTNode(p);VisitData(p);p = p->rchild; //右子pNode.pop(); //出栈pNode.push(p); //右子入栈}}}void InOderTraverse2(BiTNode* pRoot){std::stack<BiTNode*> pNode;BiTNode* p = pRoot;while(p != NULL || !pNode.empty()){if(p != NULL){pNode.push(p); //入栈,直到左树的左边p = p->lchild;}else{p = pNode.top(); //栈顶VisitData(p);pNode.pop(); //出栈p = p->rchild;}}}void InOderTraverse3(BiTNode* pRoot){std::stack<BiTNode*> pNode;BiTNode* p = pRoot;while(p != NULL || !pNode.empty()){while(p != NULL) //遍历左子树{pNode.push(p); //入栈,直到左树的左边p = p->lchild;}if(!pNode.empty()){p = pNode.top(); //栈顶VisitData(p);pNode.pop(); //出栈p = p->rchild;}}}//3.后续遍历(非递归)void PostOderTraverse1(BiTNode* pRoot){std::stack<BiTNode*> pNode;BiTNode* p = pRoot, *q;int flag;do{while(p != NULL) //遍历左子树{pNode.push(p); p = p->lchild;}q = NULL;flag = 1;while(!pNode.empty() && flag){p = pNode.top(); //栈顶if(p->rchild == q){VisitData(p);q = p;pNode.pop();}else{p = p->rchild; //遍历右子树flag = 0;}}}while(!pNode.empty());}void PostOderTraverse2(BiTNode* pRoot){std::stack<BiTNode*> pNode;BiTNode* p = pRoot, *q;int flag;do{while(p != NULL) //遍历左子树{pNode.push(p); p = p->lchild;}q = NULL;flag = 1;while(!pNode.empty() && flag){p = pNode.top(); //栈顶if(p->rchild == q){VisitData(p);q = p;pNode.pop();}elsebreak;}if(!pNode.empty()){flag = 0;p = p->rchild; //遍历右子树}}while(!pNode.empty());}//4.层次遍历(队列实现)void BFSTraverse(BiTNode* pRoot){if(pRoot == NULL)return;std::queue<BiTNode*> pNode;pNode.push(pRoot);//根结点进队列while(!pNode.empty()){BiTNode* pHead = pNode.front(); //队首元素VisitData(pHead);pNode.pop(); //首元素出队列if(pHead->lchild != NULL)pNode.push(pHead->lchild); //左孩子进队列if(pHead->rchild != NULL)pNode.push(pHead->rchild); //右孩子进队列}}//销毁二叉树void DestroyBiTree(BiTNode* pRoot){if(pRoot == NULL)return;BiTNode* pLeft = pRoot->lchild;BiTNode* pRight = pRoot->rchild;free(pRoot);DestroyBiTree(pLeft);DestroyBiTree(pRight);}/****************测试二叉树的基本操作******************/void Test1(){//创建二叉树结点BiTNode* pNode1 = CreateBiTNode(1);BiTNode* pNode2 = CreateBiTNode(2);BiTNode* pNode3 = CreateBiTNode(3);BiTNode* pNode4 = CreateBiTNode(4);BiTNode* pNode5 = CreateBiTNode(5);BiTNode* pNode6 = CreateBiTNode(6);BiTNode* pNode7 = CreateBiTNode(7);BiTNode* pNode8 = CreateBiTNode(8);//连接结点构成二叉树ConnectBiTNode(pNode1,pNode2,pNode3);ConnectBiTNode(pNode2,pNode4,NULL);ConnectBiTNode(pNode3,pNode5,pNode6);ConnectBiTNode(pNode4,NULL,pNode7);ConnectBiTNode(pNode6,pNode8,NULL);//输出二叉树//先序遍历(递归)//PreOderTraverse(pNode1);//中序遍历(递归)//InOderTraverse(pNode1);//后序遍历(递归)//PostOderTraverse(pNode1);//先序遍历(非递归)//PreOderTraverse1(pNode1);//中序遍历(非递归)//InOderTraverse1(pNode1);//InOderTraverse2(pNode1);//InOderTraverse3(pNode1);//后序遍历(非递归)//PostOderTraverse1(pNode1);PostOderTraverse2(pNode1);//层次遍历 //BFSTraverse(pNode1);//销毁二叉树DestroyBiTree(pNode1);}int _tmain(int argc, _TCHAR* argv[]){Test1();return 0;}
0 0
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- Poj 1967 &&Zoj 2183 Alibaba
- 文件类型,c语言文件读写,文件缓冲,文件打开方式,文件操作函数
- mac上ssh没用要启动ssh服务就可以了
- hive中文官方文档
- 当项目经理需要修炼的9件事
- 二叉树的基本操作
- VC 运行时库中的 new/delete 函数
- CodeForces 425B Sereja and Table
- 职责链模式(chain of responsibility)
- 安卓基础之权限大全
- -----------js判断变量初始化的三种形式
- MFC动态链接库的制作步骤和使用方法
- 如何通过MessageForm类匹配字符串
- mybatis入门,对单表的增删改查