二叉树非递归和递归遍历(先序,中序,后序)

来源:互联网 发布:山西公共频道网络直播 编辑:程序博客网 时间: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
原创粉丝点击