码迷,mamicode.com
首页 > 其他好文 > 详细

树 森林与二叉树的转换

时间:2016-08-08 07:39:28      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:树 森林

1、树、森林为什么向二叉树转换?

        因为在实际的处理问题中,大多数情况都是一对多,就向树、森林这样的数据结构!

而对于二叉树我们已经很熟悉了,所以转向我们所熟悉的结构,好处理。

2、孩子兄弟树的方法

        把握左孩子右兄弟的原则:

        (1)、树与二叉树的转换:i>以树的根结点为二叉树的根节点;

                                              ii>左孩子指针指向该根节点的第一个子结点;

                                              iii>右孩子指针指向"兄弟结点"

        (2)、二叉树表示森林:i>二叉树的根结点是森林中第一棵树的根结点

                                           ii>根结点的右孩子为森林中其它树的根结点

3、图形表示法

技术分享

4、树的创建----->化二叉树

        应具有的存储结构:树结点和树

template<typename Type>
class TreeNode{
    friend class Tree<Type>;
public:
    TreeNode() : data(Type()), firstChild(NULL), nextSibling(NULL){}
    TreeNode(Type d, TreeNode *first = NULL, TreeNode *next = NULL) :
    data(d), firstChild(first), nextSibling(next){}
    ~TreeNode(){}
private:
    Type data;
    TreeNode *firstChild;  //第一个孩子
    TreeNode *nextSibling; //下一个兄弟
};

template<typename Type>
class Tree{
public:
    Tree() : root(NULL){}
    Tree(Type ref) : root(NULL), refval(ref){}
    ~Tree(){}
private:
    TreeNode<Type> *root;
    Type           refval; //‘#‘
};

5、应该实现的方法:

public:
    void createTree(const char *str);  //创建树
    int size()const;     //求树的结点个数
    int height()const;   //求树高
    TreeNode<Type>* root_1()const;  //返回根结点
    bool isEmpty()const;  //判树空
    TreeNode<Type> *firstChild()const;  //返回第一个孩子结点
    TreeNode<Type> *nextSibling()const; //返回第一个兄弟结点
    TreeNode<Type>* find(Type key)const; //查找当前结点
    TreeNode<Type>* parent(TreeNode<Type> *cur)const;  //查找当前结点的父

        (1)、创建树(化二叉树)----->在我们的思想中就是二叉树的创建。

        (2)、求结点个数--->根二叉树的一样

        (3)、查找当前结点----->跟二叉树一样

        (4)、求树高(森林的也可以求出):

    int height(TreeNode<Type> *t)const{
        TreeNode<Type> *p;
        int m;
        int max = 0;

        if(t == NULL){
            return 0;  //空树,高0
        }else if(t->firstChild == NULL){
            return 1;  //只有根,为1
        }else{
            p = t->firstChild; //先为第一个孩子
            while(p != NULL){
                m = height(p); //求高
                if(max < m){
                    max = m;   //遍历所有的分支,每次求最高的
                }
                p = p->nextSibling;  //每次往右分支走,但还是求的左边树高;
            }
            return max+1;  //返回时加上根的高度
        }
    }

        (5)、查找当前结点的父(自己画图多多跟踪)

    TreeNode<Type>* parent(TreeNode<Type> *t, TreeNode<Type> *cur)const{
        if(t == NULL || cur == NULL || t == cur){  //父为NULL
            return NULL;
        }
        TreeNode<Type> *p = t->firstChild;
        while(p != NULL && p != cur){
            TreeNode<Type> *tmp = parent(p, cur); //递归查找其父结点,将找的结果给了tmp;
            if(tmp != NULL){
                return tmp;
            }
            p = p->nextSibling;  //在往右找
        }
        if(p != NULL && p == cur){
            return t;       //找到了
        }else{
            return NULL;
        }
    }

6、全部代码、测试代码,测试结果

        (1)、因为少,所以都在类内实现:

#ifndef _TREE_H_
#define _TREE_H_

#include<iostream>
using namespace std;

template<typename Type>
class Tree;

template<typename Type>
class TreeNode{
    friend class Tree<Type>;
public:
    TreeNode() : data(Type()), firstChild(NULL), nextSibling(NULL){}
    TreeNode(Type d, TreeNode *first = NULL, TreeNode *next = NULL) :
    data(d), firstChild(first), nextSibling(next){}
    ~TreeNode(){}
private:
    Type data;
    TreeNode *firstChild;
    TreeNode *nextSibling;
};

template<typename Type>
class Tree{
public:
    Tree() : root(NULL){}
    Tree(Type ref) : root(NULL), refval(ref){}
    ~Tree(){}
public:
    void createTree(const char *str){
        createTree(root, str);
    }
    int size()const{
        return size(root);
    }
    int height()const{
        return height(root);
    }
    TreeNode<Type>* root_1()const{
        return root;
    }
    bool isEmpty()const{
        return root == NULL;
    }
    TreeNode<Type> *firstChild()const{
        if(root != NULL){
            return root->firstChild;
        }
        return NULL;
    }
    TreeNode<Type> *nextSibling()const{
        if(root != NULL){
            return root->nextSibling;
        }
        return NULL;
    }
    TreeNode<Type>* find(const Type &key)const{
        return find(root, key);
    } 
    TreeNode<Type>* parent(TreeNode<Type> *cur)const{
        return parent(root, cur);
    }
protected:
    void createTree(TreeNode<Type> *&t, const char *&str){
        if(*str == refval){
            t = NULL;
        }else{
            t = new TreeNode<Type>(*str);
            createTree(t->firstChild, ++str);
            createTree(t->nextSibling, ++str);
        }
    }
    int size(TreeNode<Type> *t)const{
        if(t == NULL){
            return 0;
        }
        return size(t->firstChild) + size(t->nextSibling) + 1;
    }
    TreeNode<Type>* parent(TreeNode<Type> *t, TreeNode<Type> *cur)const{
        if(t == NULL || cur == NULL || t == cur){
            return NULL;
        }
        TreeNode<Type> *p = t->firstChild;
        while(p != NULL && p != cur){
            TreeNode<Type> *tmp = parent(p, cur);
            if(tmp != NULL){
                return tmp;
            }
            p = p->nextSibling;
        }
        if(p != NULL && p == cur){
            return t;
        }else{
            return NULL;
        }
    }
    TreeNode<Type>* find(TreeNode<Type> *t, const Type &key)const{
        if(t == NULL){
            return NULL;
        }
        if(t->data == key){
            return t;
        }
        TreeNode<Type>* p  = find(t->firstChild, key);
        if(p != NULL){
            return p;
        }
        return find(t->nextSibling, key);
    }
    int height(TreeNode<Type> *t)const{
        TreeNode<Type> *p;
        int m;
        int max = 0;

        if(t == NULL){
            return 0;
        }else if(t->firstChild == NULL){
            return 1;
        }else{
            p = t->firstChild;
            while(p != NULL){
                m = height(p);
                if(max < m){
                    max = m;
                }
                p = p->nextSibling;
            }
            return max+1;
        }
    }
private:
    TreeNode<Type> *root;
    Type           refval;  //‘#‘
};

#endif

         (2)、测试代码:

技术分享

#include"tree.h"

int main(void){
    char *str = "RAD#E##B#CFG#H#K#####";  //先根序的二叉树序列;
    Tree<char> t(‘#‘);
    t.createTree(str);
    TreeNode<char> *p = t.find(‘C‘);
    TreeNode<char> *q = t.parent(p);
    TreeNode<char> *m = t.find(‘R‘);
    printf("%p %p\n", q, m);
    cout<<t.size()<<endl;
    cout<<t.height()<<endl;
    
    return 0;
}

        (3)、测试结果

技术分享      




  

本文出自 “11586096” 博客,请务必保留此出处http://11596096.blog.51cto.com/11586096/1835487

树 森林与二叉树的转换

标签:树 森林

原文地址:http://11596096.blog.51cto.com/11586096/1835487

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!