2叉树遍历的递归实现-使用c++模板
来源:互联网 发布:sql获取当前时间 编辑:程序博客网 时间:2024/06/05 03:24
前言
2叉树的遍历, 为了效率, 不能用模板实现.
先用递归实现一个, 找找感觉.
测试程序
/// @file exam_x_x.cpp/// @brief 用递归实现2叉树遍历#include <iostream>#include <limits>#include "MyTree.h"using namespace std;void clear_cin();void fnTestTree();int main(int argc, char** argv, char** envp){ fnTestTree(); cout << "END, press any key to quit" << endl; clear_cin(); getchar(); return 0;}void fnTestTree(){ // A + B*(C-D)/(E-F) - G CMyTree<char> tree; CMyTreeNode<char>* pRootNode = NULL; CMyTreeNode<char>* pNodeCur = NULL; CMyTreeNode<char>* pNodeTmp1 = NULL; CMyTreeNode<char>* pNodeTmp2 = NULL; CMyTreeNode<char>* pNodeTmp3 = NULL; CMyTreeNode<char>* pNodeTmp4 = NULL; CMyTreeNode<char>* pNodeTmp5 = NULL; // C-D pNodeTmp1 = tree.MakeNewNode('-'); tree.insertNode(pNodeTmp1, NODE_LEFT, 'C'); tree.insertNode(pNodeTmp1, NODE_RIGHT, 'D'); // E-F pNodeTmp2 = tree.MakeNewNode('-'); tree.insertNode(pNodeTmp2, NODE_LEFT, 'E'); tree.insertNode(pNodeTmp2, NODE_RIGHT, 'F'); // B*(C-D) pNodeTmp3 = tree.MakeNewNode('*'); tree.insertNode(pNodeTmp3, NODE_LEFT, 'B'); tree.insertNode(pNodeTmp3, NODE_RIGHT, pNodeTmp1); // B*(C-D)/(E-F) pNodeTmp4 = tree.MakeNewNode('/'); tree.insertNode(pNodeTmp4, NODE_LEFT, pNodeTmp3); tree.insertNode(pNodeTmp4, NODE_RIGHT, pNodeTmp2); // A + B*(C-D)/(E-F) pNodeTmp5 = tree.MakeNewNode('+'); tree.insertNode(pNodeTmp5, NODE_LEFT, 'A'); tree.insertNode(pNodeTmp5, NODE_RIGHT, pNodeTmp4); // A + B*(C-D)/(E-F) - G pRootNode = tree.insertRootNode('-'); tree.insertNode(pRootNode, NODE_LEFT, pNodeTmp5); tree.insertNode(pRootNode, NODE_RIGHT, 'G'); // - + A / * B - C D - E F G tree.printTree_DLR(tree.getRootNode()); printf("\n"); // A + B * C - D / E - F - G tree.printTree_LDR(tree.getRootNode()); printf("\n"); // A B C D - * E F - / + G - tree.printTree_LRD(tree.getRootNode()); printf("\n"); // A + B*(C-D)/(E-F) - G // 后序遍历表达式的模拟计算 // A B C D - * E F - / + G - // A B (C-D) * E F - / + G - // A B*(C-D) E F - / + G - // A B*(C-D) (E-F) / + G - // A B*(C-D)/(E-F) + G - // A+B*(C-D)/(E-F) G -} // A+B*(C-D)/(E-F)-Gvoid clear_cin(){ cin.clear(); cin.sync();}
模板实现的2叉树
// MyTree.h: interface for the CMyTree class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_MYTREE_H__4898D3E6_65B2_4A17_9CA5_910BEF38E313__INCLUDED_)#define AFX_MYTREE_H__4898D3E6_65B2_4A17_9CA5_910BEF38E313__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define NODE_LEFT true#define NODE_RIGHT falsetemplate<typename T>class CMyTreeNode{public: CMyTreeNode() : m_Element((T)0) , m_pParent(NULL) , m_pChildLeft(NULL) , m_pChildRight(NULL) {} ~CMyTreeNode() {} T m_Element; ///< 元素 CMyTreeNode* m_pParent; ///< 父节点 CMyTreeNode* m_pChildLeft; ///< 左孩子结点 CMyTreeNode* m_pChildRight; ///< 右孩子结点};template<typename T>class CMyTree {public: CMyTree() : m_pRoot(NULL) {} virtual ~CMyTree() {free(m_pRoot);} CMyTreeNode<T>* insertRootNode(T Element); CMyTreeNode<T>* MakeNewNode(T Element); CMyTreeNode<T>* insertNode(CMyTreeNode<T>* pNode, bool isLeft, T Element); CMyTreeNode<T>* insertNode(CMyTreeNode<T>* pNode, bool isLeft, CMyTreeNode<T>* pNodeChildExist); CMyTreeNode<T>* getRootNode() {return m_pRoot;} void printTree_DLR(CMyTreeNode<T>* pTreeNode); ///< 前序-遍历打印 void printTree_LDR(CMyTreeNode<T>* pTreeNode); ///< 中序-遍历打印 void printTree_LRD(CMyTreeNode<T>* pTreeNode); ///< 后序-遍历打印 void free(CMyTreeNode<T>* pTreeNode); ///< 释放资源private: CMyTreeNode<T>* m_pRoot;};template<typename T>void CMyTree<T>::free(CMyTreeNode<T>* pTreeNode){ /// 按照LRD后序释放资源合理 if (NULL != pTreeNode) { if (NULL != pTreeNode->m_pChildLeft) free(pTreeNode->m_pChildLeft); if (NULL != pTreeNode->m_pChildRight) free(pTreeNode->m_pChildRight); if (NULL != pTreeNode->m_pParent) pTreeNode->m_pParent = NULL; delete pTreeNode; pTreeNode = NULL; }}template<typename T>void CMyTree<T>::printTree_DLR(CMyTreeNode<T>* pTreeNode){ if (NULL != pTreeNode) { cout << pTreeNode->m_Element << " "; printTree_DLR(pTreeNode->m_pChildLeft); printTree_DLR(pTreeNode->m_pChildRight); }}template<typename T>void CMyTree<T>::printTree_LDR(CMyTreeNode<T>* pTreeNode){ if (NULL != pTreeNode) { if (NULL != pTreeNode->m_pChildLeft) printTree_LDR(pTreeNode->m_pChildLeft); cout << pTreeNode->m_Element << " "; if (NULL != pTreeNode->m_pChildRight) printTree_LDR(pTreeNode->m_pChildRight); }}template<typename T>void CMyTree<T>::printTree_LRD(CMyTreeNode<T>* pTreeNode){ if (NULL != pTreeNode) { if (NULL != pTreeNode->m_pChildLeft) printTree_LRD(pTreeNode->m_pChildLeft); if (NULL != pTreeNode->m_pChildRight) printTree_LRD(pTreeNode->m_pChildRight); cout << pTreeNode->m_Element << " "; }}template<typename T>CMyTreeNode<T>* CMyTree<T>::insertRootNode(T Element){ if (NULL == m_pRoot) { m_pRoot = new CMyTreeNode<T>; m_pRoot->m_Element = Element; } return m_pRoot;}template<typename T>CMyTreeNode<T>* CMyTree<T>::MakeNewNode(T Element){ CMyTreeNode<T>* pNewNode = new CMyTreeNode<T>; pNewNode->m_Element = Element; return pNewNode;}template<typename T>CMyTreeNode<T>* CMyTree<T>::insertNode(CMyTreeNode<T>* pNode, bool isLeft, T Element){ CMyTreeNode<T>* pNodeChild = NULL; if (NULL != pNode) { pNodeChild = new CMyTreeNode<T>; pNodeChild->m_Element = Element; pNodeChild->m_pParent = pNode; if (isLeft) pNode->m_pChildLeft = pNodeChild; else pNode->m_pChildRight = pNodeChild; } return pNode;}template<typename T>CMyTreeNode<T>* CMyTree<T>::insertNode(CMyTreeNode<T>* pNode, bool isLeft, CMyTreeNode<T>* pNodeChildExist){ if (NULL != pNode) { if (NULL != pNodeChildExist) pNodeChildExist->m_pParent = pNode; if (isLeft) pNode->m_pChildLeft = pNodeChildExist; else pNode->m_pChildRight = pNodeChildExist; } return pNodeChildExist;}#endif // !defined(AFX_MYTREE_H__4898D3E6_65B2_4A17_9CA5_910BEF38E313__INCLUDED_)
0 0
- 2叉树遍历的递归实现-使用c++模板
- 【c++】c++模板类,实现二叉树非递归遍历
- C语言实现二叉树的递归遍历与非递归遍历
- C语言实现二叉树的递归遍历和非递归遍历
- C语言实现二叉树的递归遍历与非递归遍历
- 递归实现二叉树的建立及前中后序遍历 c
- 二叉树遍历的c语言非递归实现
- 二叉树的非递归遍历C实现
- 二叉树的非递归遍历C语言实现
- 【算法】二叉树的递归遍历C语言实现
- 数据结构-C语言递归实现树的前中后序遍历
- 递归非递归实现树的遍历
- 递归实现树的遍历
- C语言实现二叉树的常用的算法(递归与非递归实现遍历)
- C实现二叉树(模块化集成,遍历的递归与非递归实现)
- 树的递归遍历和非递归遍历源码(C++)
- 数据结构的C实现_二叉树的非递归遍历和层序遍历
- 【C++】二叉树遍历--递归与非递归实现
- 乐视揭秘Android5.0手机APP安装失败真相
- 统计学习笔记(1)——统计学习方法概论
- 工厂方法模式
- iOS NSNotificationCenter详解
- Server Tomcat v7.0 Server at localhost failed to start.
- 2叉树遍历的递归实现-使用c++模板
- swift函数式编程-函数基础
- Android Studio中文字体显示乱码
- class_create() and device_create()
- 《Effective java》读书记录-第13条-使类和成员的可访问性最小化
- 统计学习笔记(2)——感知机模型
- 无定位父元素时offsetParent为body,但是offsetTop/offsetLeft计算距离从html开始
- 在Android中使用OpenGL效果渲染
- 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决