创建理想的平衡二叉树
2008年10月25日
理想的平衡二叉树,包括满二叉树和完全二叉树.也就是层次建立二叉树
假设有数字1,2,3,4,5,6,7,8,9要组合成如下图所示的一颗完全二叉树.
1
2 3
4 5 6 7
8 9
节点1的数据域的值是1
节点2的数据域的值是2
节点3的数据域的值是3
依次类推
#include<iostream>
#include<deque>
using namespace std;
/*******************************************/
//二叉树节点的结构
template<typename T>
class node
{
public:
node(const T &Data, node<T> *L=NULL, node<T> *R=NULL, node<T> *P=NULL):left(L),right(R),parent(P),data(Data){}
public:
T data;
node<T> *left, *right,*parent;//parent
};
template<typename T>
//建立树,及对树的一些操作
class BTree
{
public:
BTree(node<T> *R=NULL):root(R)
{ }
~BTree()
{
}
void create(const T &data);
void preOrder(node<T> *r);
void inOrder(node<T> *r);
void postOrder(node<T> *r);
public:
node<T> *root;
};
template<typename T>
总体分析
首先创建一个根节点,
然后执行如下过程
判断这个节点是否存在左子树,不存在就将节点作为左子树创建,如果存在左子树就判断这个节点是否有右子树,没有就将节点作为右子树创建.
判断节点的优先原则:根据队列的先进先出的原则,将最新需要判断节点进行入队列操作.也就是1进来,然后是2,3……
void BTree<T>::create(const T &data)
{
deque< node<T>* > Q;
node<T> *cur;
//根的创建
if(root)
Q.push_back(root);
else
{
root = new node<T>(data, NULL, NULL, NULL);
return;
}
//创建其他节点
while(!Q.empty())
{
cur = Q.front();
Q.pop_front();
if(cur->left)
Q.push_back(cur->left);
else
{
cur->left = new node<T>(data, NULL, NULL, cur);
return;
}
if(cur->right)
Q.push_back(cur->right);
else
{
cur->right = new node<T>(data, NULL, NULL, cur);
return;
}
}
}
分析如下:
1,2,3,4,5,6,7,8,9依次进入create(const T &data)
1进来之后
首先要创建一个队列Q用于存储二叉树的节点
root在初始化的为NULL,所有就执行了 root = new node<T>(data, NULL, NULL, NULL);创建了一个节点 root指向节点1,函数返回
2进来了
root已经不是NULL了,1进入队列Q.
将队头指针赋给cur,cur和root都是指向1
队列中头元素删除,也就是将1删除
cur的左指针是NULL,所以要创建一个节点,2就是该节点数据域的值,节点2的父节点是1,cur指向节点1
3进来之后
1进入队列,又将1从队列中出来,1的左指针不为空,所以2就进入了队列.
判断1右指针为空之后,创建节点3,3的父节点是1
4进来之后
1入队列,1出来之后,2入队列,3也入队列.队列里有2和3
因为队列里还有数据循环还要继续运行
队列是先进先出原则,所以2先出来,cur指针指向节点2,2出队列
因为节点2的左指针域为空,所以创建节点4,4的父节点是2,cur指向的也是2,创建节点函数就结束
5进来之后
1进入队列,1出来之后,将1的两个子节点2,3进队列,2出队列,4入队列,判断2无右子树,所以创建节点5,函数结束
6进入之后
队列中的数据是5,4,3,判断3不存在左子树,就创建节点6.
…….
完成代码在http://blog.csdn.net/flyfish1986/archive/2008/10/24/3137898.aspx