第53课 - 树中结点的查找操作

1、树中结点的查找操作 

            查找的方式 

                -基于数据元素值的查找 

                        GTreeNode<T>*  find(const T& value) const 

                -基于结点的查找 

                         GTreeNode< T>*   find( TreeNode< T>* node) const 


            树中数据元素和结点的查找 

                

                                                                递归的思想



            基于数据元素值的查找 

                    - 定义功能:  find(node, value

                            在node为根结点的树中查找value所在的结点 

    


            基于结点的查找 

                 - 定义功能: find(node, obj) 

                            在node为根结点的树中查找是否存在obj结点

                            

    

2、编程实验 

基于数据元素值的查找 

基于结点的查找 

#ifndef GTREE_H
#define GTREE_H

#include "Tree.h"
#include"GTreeNode.h"

namespace DTLib
{
template < typename T >
class GTree : public Tree<T>
{
protected:
    GTreeNode<T>* find(GTreeNode<T>* node,const T& value) const
    {
        GTreeNode<T>* ret = NULL;

        if(node != NULL)
        {
            if(node->value == value)
            {
                return node;
            }
            else
            {
                for(node->child.move(0);!node->child.end() && (ret == NULL);node->child.next())     //在node子树中查找
                {
                    ret = find(node->child.current(),value);    //child里数据元素类型是GTreeNode<T>*
                }
            }
        }

        return ret;
    }

    GTreeNode<T>* find(GTreeNode<T>* node,GTreeNode<T>* obj) const
    {
        GTreeNode<T>* ret = NULL;

        if(node == obj)
        {
            return node;
        }
        else
        {
            if(node != NULL)
            {
                for(node->child.move(0);!node->child.end() && (ret == NULL);node->child.next())
                {
                    ret = find(node->child.current(),obj);
                }
            }
        }

        return ret;
    }

public:
    bool insert(TreeNode<T>* node)
    {
        bool ret = true;

        return ret;
    }

    bool insert(const T& value,TreeNode<T>* parent)
    {
        bool ret = true;

        return ret;
    }

    SharedPointer< Tree<T> > remove(const T& value)
    {

        return NULL;
    }

    SharedPointer< Tree<T> > remove(TreeNode<T>* node)
    {

        return NULL;
    }

    GTreeNode<T>* find(const T& value) const    //GTreeNode  赋值兼容原则
    {
        return find(root(),value);
    }
    GTreeNode<T>* find(TreeNode<T>* node) const
    {
        return find(root(),dynamic_cast< GTreeNode<T>* >(node));
    }
    GTreeNode<T>* root() const
    {
        return dynamic_cast< GTreeNode<T>* >(this->m_root);
    }
    int degree() const
    {
        return 0;
    }
    int count() const
    {
        return 0;
    }
    int height() const
    {
        return 0;
    }
    void clear()
    {
        this->m_root = NULL;
    }

    ~GTree()
    {
        clear();
    }
};

}
#endif // GTREE_H

main.cpp

#include <iostream>
#include"GTree.h"

using namespace std;
using namespace DTLib;


int main()
{
    GTree<int> t;
    GTreeNode<int> tn;

    t.find(0);

    t.find(&tn);

    return 0;
}

                        



3、小结 

            查找操作是树的关键操作之— 

            基于数据元素的查找可判断值是否存在于树中 

            基于结点的查找可判断树中是否存在指定结点 

             插入操作和删除操作都依赖于查找操作 


4、实战预告 

        To be continued ... 

        思考: 

                如何实现GTree (通用树结构)的结点插入操作


猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/80462405