创建理想的平衡二叉树

创建理想的平衡二叉树

 

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

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/flyfish1986/article/details/3143216
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞