二叉树的遍历
来源:互联网 发布:阿里云客服抢班语录 编辑:程序博客网 时间:2024/04/25 12:57
自娱自乐型。
1 Tree.h 定义Tree相关的,使用了STL
#ifndef __TREE_H__#define __TREE_H__#include <iostream>#include <stack>#include <queue>using std::iostream;using std::cout;using std::endl;using std::stack;using std::queue;struct BinaryTreeNode;typedef void (*BTREENODE_VISIT)(BinaryTreeNode* pBTreeNode);struct BinaryTreeNode{int data;int flags; //0:not in stack, 1: in stackint height;BinaryTreeNode* pLeftChildren;BinaryTreeNode* pRightChildren;BinaryTreeNode(){pLeftChildren = pRightChildren = NULL;flags = 0;height = 0;}BinaryTreeNode(int data){pLeftChildren = pRightChildren = NULL;this->data = data;flags = 0;height = 0;}void createTrees(BinaryTreeNode *pLeft,BinaryTreeNode* pRight){pLeftChildren = pLeft;pRightChildren = pRight;}static void preOrderVisitRecurs(BinaryTreeNode* pBTree,BTREENODE_VISIT pBTNodeVisitFunc){if(pBTree){if(pBTNodeVisitFunc)pBTNodeVisitFunc(pBTree);if(pBTree->pLeftChildren)preOrderVisitRecurs(pBTree->pLeftChildren,pBTNodeVisitFunc);if(pBTree->pRightChildren)preOrderVisitRecurs(pBTree->pRightChildren,pBTNodeVisitFunc);}return;}static void preOrderVisit(BinaryTreeNode* pBTree, BTREENODE_VISIT pBTNodeVisitFunc){if(pBTree == NULL)return;typedef stack<BinaryTreeNode*> CBTNodeStack;CBTNodeStack btnStack;btnStack.push(pBTree);while(btnStack.size() > 0){BinaryTreeNode* pCurrent = btnStack.top();if(pCurrent)pBTNodeVisitFunc(pCurrent);btnStack.pop();if(pCurrent->pRightChildren)btnStack.push(pCurrent->pRightChildren);if(pCurrent->pLeftChildren)btnStack.push(pCurrent->pLeftChildren);}};static void inOrderVisitRecurs(BinaryTreeNode* pBTree,BTREENODE_VISIT pBTNodeVisitFunc){if(pBTree){if(pBTree->pLeftChildren)inOrderVisitRecurs(pBTree->pLeftChildren,pBTNodeVisitFunc);if(pBTNodeVisitFunc)pBTNodeVisitFunc(pBTree);if(pBTree->pRightChildren)inOrderVisitRecurs(pBTree->pRightChildren,pBTNodeVisitFunc);}return;}static void inOrderVisit(BinaryTreeNode* pBTree,BTREENODE_VISIT pBTNodeVisitFunc){if(pBTree == NULL)return;typedef stack<BinaryTreeNode*> CBTNodeStack;CBTNodeStack btnStack;btnStack.push(pBTree);pBTree->flags = 1;while(btnStack.size() > 0){pBTree = btnStack.top();while(pBTree->pLeftChildren != NULL && pBTree->pLeftChildren->flags == 0){btnStack.push(pBTree->pLeftChildren);pBTree->pLeftChildren->flags = 1;pBTree = btnStack.top();}pBTree = btnStack.top();if(pBTNodeVisitFunc)pBTNodeVisitFunc(pBTree); //visit the left leaf or leftest rootbtnStack.pop();if(pBTree->pRightChildren && pBTree->pRightChildren->flags == 0){btnStack.push(pBTree->pRightChildren);pBTree->pRightChildren->flags = 1;continue;}}return;}static void postOrderVisitRecurs(BinaryTreeNode* pBTree,BTREENODE_VISIT pBTNodeVisitFunc){if(pBTree){if(pBTree->pLeftChildren)postOrderVisitRecurs(pBTree->pLeftChildren,pBTNodeVisitFunc);if(pBTree->pRightChildren)postOrderVisitRecurs(pBTree->pRightChildren,pBTNodeVisitFunc);if(pBTNodeVisitFunc)pBTNodeVisitFunc(pBTree);}return;}static void postOrderVisit(BinaryTreeNode* pBTree,BTREENODE_VISIT pBTNodeVisitFunc){if(pBTree == NULL)return;typedef stack<BinaryTreeNode*> CBTNodeStack;CBTNodeStack btnStack;btnStack.push(pBTree);pBTree->flags = 1;while(btnStack.size() > 0){pBTree = btnStack.top();while(pBTree->pLeftChildren != NULL && pBTree->pLeftChildren->flags == 0){btnStack.push(pBTree->pLeftChildren);pBTree->pLeftChildren->flags = 1;pBTree = btnStack.top();}pBTree = btnStack.top();if(pBTree->pRightChildren && pBTree->pRightChildren->flags == 0){btnStack.push(pBTree->pRightChildren);pBTree->pRightChildren->flags = 1;continue;}if(pBTNodeVisitFunc)pBTNodeVisitFunc(pBTree);btnStack.pop();}return;};static void levelVisit(BinaryTreeNode* pBTree,BTREENODE_VISIT pBTNodeVisitFunc){typedef queue<BinaryTreeNode*> CBTNodeQueue;CBTNodeQueue btQueue;btQueue.push(pBTree);while(btQueue.size()){BinaryTreeNode* pCurrent = btQueue.front();if(pCurrent->pLeftChildren)btQueue.push(pCurrent->pLeftChildren);if(pCurrent->pRightChildren)btQueue.push(pCurrent->pRightChildren);if(pBTNodeVisitFunc)pBTNodeVisitFunc(pCurrent);btQueue.pop();}}};#endif
2 测试:
// DataStructTest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Tree.h"void PRINT_BNVALUE(BinaryTreeNode* pBTreeNode){cout<<"TreeVale " << pBTreeNode->data << endl;}void RESET_FLAGS(BinaryTreeNode* pBTreeNode){pBTreeNode->flags = 0;}int _tmain(int argc, _TCHAR* argv[]){/* 构造目标树 1/ \ 2 3 / \ / 4 5 6 / \ 7 8*/BinaryTreeNode testBNTree8(8);BinaryTreeNode testBNTree7(7);BinaryTreeNode testBNTree6(6);BinaryTreeNode testBNTree5(5);BinaryTreeNode testBNTree4(4);BinaryTreeNode testBNTree3(3);BinaryTreeNode testBNTree2(2);BinaryTreeNode testBNTree1(1);testBNTree1.createTrees(&testBNTree2,&testBNTree3);testBNTree2.createTrees(&testBNTree4,&testBNTree5);testBNTree5.createTrees(&testBNTree7,NULL);testBNTree3.createTrees(&testBNTree6,NULL);testBNTree6.createTrees(NULL,&testBNTree8);cout<<"travse pre order recurs"<<endl;BinaryTreeNode::preOrderVisitRecurs(&testBNTree1,PRINT_BNVALUE);cout<<"travse pre order NOT recurs"<<endl;BinaryTreeNode::preOrderVisit(&testBNTree1,PRINT_BNVALUE);cout<<"travse in order recurs"<<endl;BinaryTreeNode::inOrderVisitRecurs(&testBNTree1,PRINT_BNVALUE);cout<<"travse in order NOT recurs"<<endl;BinaryTreeNode::inOrderVisit(&testBNTree1,PRINT_BNVALUE);//采用层级遍历清空flags标志BinaryTreeNode::levelVisit(&testBNTree1,RESET_FLAGS);cout<<"travse post order recurs"<<endl;BinaryTreeNode::postOrderVisitRecurs(&testBNTree1,PRINT_BNVALUE);cout<<"travse post order NOT recurs"<<endl;BinaryTreeNode::postOrderVisit(&testBNTree1,PRINT_BNVALUE);cout<<"travse level"<<endl;BinaryTreeNode::levelVisit(&testBNTree1,PRINT_BNVALUE);return 0;}
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 黑马程序员_学习日记29_winphone7开发_概述
- C#之电脑端口扫描器...
- 计算机存储
- 用一辈子去领悟的生活经典
- 黑马程序员_学习日记30_winphone7开发_项目的基本档案结构
- 二叉树的遍历
- 嵌入式系统设计师考试笔记之电子电路设计基础
- 6410触摸屏驱动分析(s3c-ts.c)(Linux)(分析)
- 黑马程序员_学习日记31_winphone7开发_控件
- 二分查找 (代码五行)
- 简单工厂模式
- HTML5设计原理
- eclipse Indigo Helios Galileo几种版本的意思
- 嵌入式系统设计师考试复习笔记之存储管理篇