二叉树非递归和递归遍历(先序,中序,后序)
来源:互联网 发布:山西公共频道网络直播 编辑:程序博客网 时间:2024/04/30 10:09
首先创建二叉树,然后对二叉树遍历进行了单元测试。只要将相应的注释取消,便可以成功运行。
/********************************************二叉树遍历前序、中序、后序的递归和非递归实现********************************************/#include<stdio.h>#include<stack>using namespace std;struct BinaryTreeNode{int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;};//创建二叉树节点BinaryTreeNode* createBinaryTreeNode(int value){BinaryTreeNode* pNode = new BinaryTreeNode();pNode->m_nValue = value;pNode->m_pRight = NULL;pNode->m_pLeft = NULL;return pNode;}//连接二叉树节点void connectBinaryTreeNode(BinaryTreeNode* pParent,BinaryTreeNode* pLeft,BinaryTreeNode* pRight){if(pParent != NULL){pParent->m_pLeft = pLeft;pParent->m_pRight = pRight;}}//销毁二叉树void destoryBinaryTree(BinaryTreeNode* pRoot){if(pRoot != NULL){BinaryTreeNode* pLeft = pRoot->m_pLeft;BinaryTreeNode* pRight = pRoot->m_pRight;delete pRoot;destoryBinaryTree(pLeft);destoryBinaryTree(pRight);}}/**********************************//前序遍历,递归实现void preOrder(BinaryTreeNode* pRoot){if(pRoot){printf("%d\n",pRoot->m_nValue);preOrder(pRoot->m_pLeft);preOrder(pRoot->m_pRight);}}***********************************//****************************************//前序遍历,非递归实现void preOrder(BinaryTreeNode* pRoot){if(pRoot){stack<BinaryTreeNode*> btnStack;while(pRoot || !btnStack.empty()){if(pRoot){printf("%d\t",pRoot->m_nValue);btnStack.push(pRoot);pRoot = pRoot->m_pLeft;}else{pRoot = btnStack.top();btnStack.pop();pRoot = pRoot->m_pRight;}}}}*********************************************//*******************************************//中序遍历,递归实现void midOrder(BinaryTreeNode* pRoot){if(pRoot){midOrder(pRoot->m_pLeft);printf("%d\t",pRoot->m_nValue);midOrder(pRoot->m_pRight);}}*******************************************//*******************************************//中序遍历,非递归实现void midOrder(BinaryTreeNode* pRoot){if(pRoot){stack<BinaryTreeNode*> btnStack;while(pRoot || !btnStack.empty()){if(pRoot){btnStack.push(pRoot);pRoot = pRoot->m_pLeft;}else{pRoot = btnStack.top();printf("%d\t",pRoot->m_nValue);btnStack.pop();pRoot = pRoot->m_pRight;}}}}**********************************************/******************************************//后序遍历,递归实现void postOrder(BinaryTreeNode* pRoot){if(pRoot){postOrder(pRoot->m_pLeft);postOrder(pRoot->m_pRight);printf("%d\t",pRoot->m_nValue);}}******************************************///后序遍历,非递归实现void postOrder(BinaryTreeNode* pRoot){if(pRoot){stack<BinaryTreeNode*> btnStack;btnStack.push(pRoot);BinaryTreeNode* pPreNode = NULL;//前一次访问的节点while(!btnStack.empty()){pRoot = btnStack.top();if((!pRoot->m_pLeft && !pRoot->m_pRight)//叶子节点或|| (pPreNode && ((pPreNode==pRoot->m_pLeft)||(pPreNode==pRoot->m_pRight))))//左右子节点都已经访问过的节点,之所以有pPreNode &&是为了防止根节点只有一个分支{printf("%d\t",pRoot->m_nValue);pPreNode = pRoot;btnStack.pop();}else{if(pRoot->m_pRight)//空节点不入栈btnStack.push(pRoot->m_pRight);//将后访问的节点先入栈if(pRoot->m_pLeft)btnStack.push(pRoot->m_pLeft);}}}}//单元测试//两边都有树枝void test1(){BinaryTreeNode* pNode1 = createBinaryTreeNode(10);BinaryTreeNode* pNode2 = createBinaryTreeNode(6);BinaryTreeNode* pNode3 = createBinaryTreeNode(14);BinaryTreeNode* pNode4 = createBinaryTreeNode(4);BinaryTreeNode* pNode5 = createBinaryTreeNode(8);BinaryTreeNode* pNode6 = createBinaryTreeNode(12);BinaryTreeNode* pNode7 = createBinaryTreeNode(16);connectBinaryTreeNode(pNode1,pNode2,pNode3);connectBinaryTreeNode(pNode2,pNode4,pNode5);connectBinaryTreeNode(pNode3,pNode6,pNode7);//preOrder(pNode1);//midOrder(pNode1);postOrder(pNode1);destoryBinaryTree(pNode1);}//左边有树枝void test2(){BinaryTreeNode* pNode1 = createBinaryTreeNode(10);BinaryTreeNode* pNode2 = createBinaryTreeNode(6);BinaryTreeNode* pNode3 = createBinaryTreeNode(14);BinaryTreeNode* pNode4 = createBinaryTreeNode(4);connectBinaryTreeNode(pNode1,pNode2,NULL);connectBinaryTreeNode(pNode2,pNode3,pNode4);//preOrder(pNode1);//midOrder(pNode1);postOrder(pNode1);destoryBinaryTree(pNode1);}//右边有树枝void test3(){BinaryTreeNode* pNode1 = createBinaryTreeNode(10);BinaryTreeNode* pNode2 = createBinaryTreeNode(6);BinaryTreeNode* pNode3 = createBinaryTreeNode(14);BinaryTreeNode* pNode4 = createBinaryTreeNode(4);connectBinaryTreeNode(pNode1,NULL,pNode2);connectBinaryTreeNode(pNode2,pNode3,pNode4);//preOrder(pNode1);//midOrder(pNode1);postOrder(pNode1);destoryBinaryTree(pNode1);}//只有根节点void test4(){BinaryTreeNode* pNode1 = createBinaryTreeNode(10);//preOrder(pNode1);//midOrder(pNode1);postOrder(pNode1);destoryBinaryTree(pNode1);}//空树void test5(){//preOrder(NULL);//midOrder(NULL);postOrder(NULL);}int main(){test1();printf("\n");test2();printf("\n");test3();printf("\n");test4();printf("\n");test5();return 0;}1 / \ 2 3 / / \ 45 6 \ / 7 8
==转载请注明出处,谢谢!
0 1
- 二叉树非递归和递归遍历(先序,中序,后序)
- 二叉树的先序、中序、后序递归遍历和非递归遍历
- 二叉树的先序、中序、后序遍历的递归和非递归实现
- 二叉树的创建和先序,中序,后序,递归,非递归遍历
- 二叉树 先、中、后序递归和非递归遍历
- 二叉树遍历(先序遍历、中序遍历、后序遍历)——递归方法和非递归方法
- 二叉树的先序/中序/后序(递归、非递归)+层序遍历
- 二叉树的先序、中序、后序遍历(递归 and 非递归)
- 二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现
- 二叉树遍历(先序、中序、后序、深度、广度)递归和非递归实现
- 先序遍历中序遍历后序遍历确定一棵二叉树(递归、非递归)
- 二叉树 非递归 先序遍历 中序遍历 后序遍历 层次遍历
- 二叉树的先序,中序和后序遍历的非递归算法
- 二叉树的非递归先序、中序和后序遍历
- 二叉树的先序、中序、后序、层序递归及非递归遍历
- 二叉树的遍历 中序 后序 先序 递归 非递归
- 二叉树创建、删除、(递归/非递归)先序(中序/后序)遍历
- 二叉树遍历 递归与非递归 先序-中序-后序
- ubuntu下jdk环境变量配置文件--ubuntu配置笔记
- GridView把主键列隐藏,即visible=false会取不到那一列的值
- 斗地主算法(3)
- PureFtp+PureAdmin:实现基于虚拟账号的FTP服务器
- 标点符号函数简化问题
- 二叉树非递归和递归遍历(先序,中序,后序)
- Ubuntu13.04下让宏碁Aspire4750G屏幕亮度可调节
- JDBC连接类
- 还在用延时函数吗——那你就out了
- WinSock网络编程学习笔记(九):基于UDP实现DayTime协议
- 求高手修正能手所编的程序!
- 社会工程学的预测展望
- 又是一个周么
- C语言中的''\0",让你透彻到底