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、请分析,为什么多叉树没有中序遍历?

  请看下篇文章解答。。。。

posted @ 2023-10-18 15:09  一日学一日功  阅读(43)  评论(0)    收藏  举报