19从汇编的角度深入理解c++_手动实现二叉树
二叉树代码:
#include "stdafx.h"
#include <string.h>
class Monster{
public:
Monster(){
};
Monster(int ID,int Level,char* Name){
this->id = ID;
this->level= Level;
memcpy(&this->name,Name,strlen(Name)+1);
};
public:
int id;
int level;
char name[20];
};
template<class T>
class TreeNode{
public:
T element;
TreeNode<T>* pleft;//等价于TreeNode* pleft;这种写法,因为TreeNode本来就是一个模板类
TreeNode<T>* pright;//等价于 TreeNode* pright;这种写法
TreeNode(T& elem)
{
memset(&element,0,sizeof(TreeNode));
memcpy(&element,&elem,sizeof(T));
pleft = pright = NULL;
}
};
template<class T>
class BSortTree{
public:
BSortTree();
~BSortTree();
public:
void InorderTraverse(TreeNode<T>* pNode);//中序遍历
void PreorderTraverse(TreeNode<T>* pNode);//前序遍历
void PostorderTraverse(TreeNode<T>* pNode);//后续遍历
TreeNode<T>* GetRoot();
int GetDepth(TreeNode<T>* pNode); //获取二叉树的高度
private:
void Init(); //初始化函数
void Clear(TreeNode<T>* m_pRoot);
private:
TreeNode<T>* m_pRoot; //根节点指针
int size; //树中元素总个数
};
template<class T>
BSortTree<T>::BSortTree(){
Init();
};
template<class T>
BSortTree<T>::~BSortTree(){
//释放所有节点;
Clear(m_pRoot);
};
template<class T>
void BSortTree<T>::Init(){
Monster m1(1,1,"刺猬");
Monster m2(2,2,"野狼");
Monster m3(3,3,"野猪");
Monster m4(4,4,"士兵");
Monster m5(5,5,"火龙");
Monster m6(6,6,"独角兽");
Monster m7(7,7,"江湖大盗");
TreeNode<Monster>* n1 = new TreeNode<Monster>(m1);
TreeNode<Monster>* n2 = new TreeNode<Monster>(m2);
TreeNode<Monster>* n3 = new TreeNode<Monster>(m3);
TreeNode<Monster>* n4 = new TreeNode<Monster>(m4);
TreeNode<Monster>* n5 = new TreeNode<Monster>(m5);
TreeNode<Monster>* n6 = new TreeNode<Monster>(m6);
TreeNode<Monster>* n7 = new TreeNode<Monster>(m7);
m_pRoot = n5;
n5->pleft = n4;
n5->pright = n6;
n4->pleft = n1;
n1->pright = n2;
n6->pleft = n3;
n3->pright = n7;
size = 7;
};
/*
5
/ \
4 6
/ /
1 3
\ \
2 7
*/
template<class T>
TreeNode<T>* BSortTree<T>::GetRoot(){
return m_pRoot;
};
template<class T>
int BSortTree<T>::GetDepth(TreeNode<T>* pNode){
if(pNode==NULL)
{
return 0;
}else{
int m = GetDepth(pNode->pleft);
int n = GetDepth(pNode->pright);
return (m>n)?(m+1):(n+1);
}
};
template<class T>
void BSortTree<T>::Clear(TreeNode<T>* pNode){
if(pNode != NULL)
{
Clear(pNode->pleft);
Clear(pNode->pright);
delete pNode;
pNode = NULL;
}
};
//中序遍历
template<class T>
void BSortTree<T>::InorderTraverse(TreeNode<T>* pNode){
if(pNode!=NULL)
{
InorderTraverse(pNode->pleft);
printf("%d\n",pNode->element);
InorderTraverse(pNode->pright);
}
};
//前序遍历
template<class T>
void BSortTree<T>::PreorderTraverse(TreeNode<T>* pNode){
if(pNode!=NULL)
{
printf("%d\n",pNode->element);
PreorderTraverse(pNode->pleft);
PreorderTraverse(pNode->pright);
}
};
//后续遍历
template<class T>
void BSortTree<T>::PostorderTraverse(TreeNode<T>* pNode){
if(pNode!=NULL)
{
PostorderTraverse(pNode->pleft);
PostorderTraverse(pNode->pright);
printf("%d\n",pNode->element);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
/*
BSortTree<Monster> bt;
bt.InorderTraverse(bt.GetRoot());
*/
BSortTree<Monster>* lpTree = new BSortTree<Monster>;
lpTree->InorderTraverse(lpTree->GetRoot());
printf("\n****************\n");
lpTree->PreorderTraverse(lpTree->GetRoot());
printf("\n****************\n");
lpTree->PostorderTraverse(lpTree->GetRoot());
getchar();
return 0;
}
问题:
1、你理解的二叉树的前中后序遍历是什么,仅仅是三个顺序不同的 List 吗?
2、请分析,后序遍历有什么特殊之处?
3、请分析,为什么多叉树没有中序遍历?
请看下篇文章解答。。。。

浙公网安备 33010602011771号