二叉树的建立、遍历、添加、销毁(...递归)
2012-12-25 17:14
363 查看
近期看到一本书上有关于二叉树的例子, 于是就自己敲了一遍。一方面让
自己加深一下对二叉树中‘递归’的用法, 另一方面 方便 新手参考。
如有不当请指正!
自己加深一下对二叉树中‘递归’的用法, 另一方面 方便 新手参考。
如有不当请指正!
#include <iostream> using namespace std; typedef int NodeNum; //记录二叉树中结点的个数 struct Node { Node(int elem) { m_elem = elem; leftNode = NULL; rightNode = NULL; } int m_elem; Node* leftNode; Node* rightNode; }; class BinTree { public: NodeNum m_nodeNum; Node* m_rootNode; BinTree(int nodeNum); void InitialTree(NodeNum nodeNum); void AddNode( int sourceNode, int addNodeNum); bool AddNode(Node* pCurNode, int sourceNode, int addNodeNum); void PrintTree(); void PrintTree(Node* pNode); void DestoryTree(); void DestoryTree(Node* pNode); }; BinTree::BinTree(int nodeNum) :m_rootNode(NULL) ,m_nodeNum(0) { m_rootNode = new Node(0); //初始化,根节点 m_nodeNum += 1; //记录结点数,初始为1(只有一个根节点) InitialTree(nodeNum); } void BinTree::InitialTree(NodeNum nodeNum) { if (nodeNum >0) { Node* pCurNode = m_rootNode; for (int i = 1; i <= nodeNum; i++) { Node * pNode = new Node(i); if (pCurNode->leftNode == NULL) // 先添加左子树 { pCurNode->leftNode = pNode; m_nodeNum++; }else if (pCurNode->rightNode == NULL) //左子树已存在,添加右子树 { pCurNode->rightNode = pNode; pCurNode = pCurNode->leftNode; //若右子树添加成功,则记录下左子树, 以便下次添加结点 //(此时,左结点作为下次添加结点的父节点) m_nodeNum++; } } } return; } void BinTree::AddNode( int fatherNode, int addNodeNum) { cout<<"在父结点"<<fatherNode<<", 上添加新结点-----------: "<<addNodeNum<<endl; if (AddNode(m_rootNode, fatherNode, addNodeNum)) { cout<<"添加成功..."<<endl; return; } cout<<"添加失败..."<<endl; return; } bool BinTree::AddNode(Node* pCurNode, int sourceNode, int addNodeNum) { if (pCurNode != NULL) { if (pCurNode->m_elem == sourceNode) { Node* pNewNode = new Node(addNodeNum); if (pCurNode->leftNode == NULL) { pCurNode->leftNode = pNewNode; m_nodeNum++; return true; }else if(pCurNode->rightNode == NULL) { pCurNode->rightNode = pNewNode; m_nodeNum++; return true; } } if (!AddNode(pCurNode->leftNode, sourceNode, addNodeNum)) { if (!AddNode(pCurNode->rightNode, sourceNode, addNodeNum) ) { return false; } } return true; } return false; } //打印二叉树 void BinTree::PrintTree() { cout<<"\n打印树..."<<endl; PrintTree(m_rootNode); return; } void BinTree::PrintTree(Node* pNode) { if (pNode == NULL) { return; } if (pNode != NULL) { cout<<pNode->m_elem<<endl; PrintTree(pNode->leftNode); PrintTree(pNode->rightNode); } } void BinTree::DestoryTree() { cout<<"\n销毁树.....................[先左右后根节点]"<<endl; if(m_rootNode != NULL) { DestoryTree(m_rootNode); } return; } void BinTree::DestoryTree(Node* pNode) { if(pNode != NULL) { DestoryTree(pNode->leftNode); DestoryTree(pNode->rightNode); cout<<"销毁的结点元素为: "<<pNode->m_elem<<endl; delete pNode; pNode = NULL; } return; } ////////////////////////////////////////////////////////////////////////// int main() { BinTree bt(10); //初始化 10 个结点的二叉树 bt.PrintTree(); //打印初始的二叉树 bt.AddNode(10,11); //在结点(10)上添加结点 bt.AddNode(10,12); bt.PrintTree(); bt.DestoryTree(); //销毁。 先销毁左右孩子结点,再销毁根结点 return 0; }
相关文章推荐
- 二叉树的建立、销毁、各种遍历(递归、非递归)
- 二叉树的建立、销毁、各种遍历(递归、非递归)
- 二叉树的建立、销毁、各种遍历(递归、非递归)
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- 二叉树的建立和遍历(递归)
- 二叉树的建立及递归遍历
- 二叉树的建立(根据遍历结果构建)、遍历(非递归)和搜索
- 二叉树先序后序递归建立,前中后序层次非递归遍历,以及统计叶子结点个数以及树的深度
- 数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历
- 数据结构之二叉树的递归建立和遍历
- 【数据结构基础】二叉树的建立和递归遍历
- javascript实现二叉树的创建,遍历,添加,查找最大值最小值和指定值的寻找及删除功能——递归的多次运用
- python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)
- 二叉树的递归创建,以及二叉查找树查找的建立 和遍历查找的比较
- 二叉树的建立以及三种遍历方式的递归、非递归的实现
- 【递归】二叉树的先序建立及遍历
- 二叉树的先序建立与非递归遍历C++版
- 二叉树的建立(非递归建立与定义建立)与基本操作(广度和深度遍历,求叶子树高)实现
- 二叉树的建立与递归遍历C++版
- C语言二叉树建立,遍历(递归与非递归),交换子树