C++数据结构第53课、树中结点的查找操作

  • 查找的方式
    — 基于数据元素值的查找:GTreeNode<T>* find(const T& value) const
    — 基于结点的查找:GTreeNode<T>* find(TreeNode<T>* node) const
    在这里插入图片描述

在这里插入图片描述

1、基于数据元素值的查找:在 protected 属性中定义 find(node, value) 功能,在 node 为根结点的树中查找 value 所在的结点

在这里插入图片描述

2、基于结点的查找:在 protected 属性中定义 find(node, obj) 功能,在 node 为根结点的树中查找是否存在 obj 结点
在这里插入图片描述
GTreeNode.h

#ifndef GTREENODE_H
#define GTREENODE_H

#include "LinkList.h"
#include "TreeNode.h"

namespace XiebsLib
{

template <typename T>
class GTreeNode : public TreeNode<T>
{
public:
    LinkList<GTreeNode<T>*> child;

};
}
#endif // GTREENODE_H

GTree.h

#ifndef GTREE_H
#define GTREE_H

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

namespace XiebsLib
{
template <typename T>
class GTree : public Tree<T>
{
protected:
    GTreeNode<T>* find(GTreeNode<T>* node, const T& value)const
    {
        GTreeNode<T>* ret = nullptr;
        if(node != nullptr)
        {
            if(node->value == value)
            {
                return node;
            }
            else
            {
                for(node->child.move(0); (!node->child.end() && ret == nullptr); node->child.next())
                {
                    ret = find(node->child.current(), value);
                }
            }
        }

        return ret;
    }

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

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

        return ret;
    }
public:
    GTreeNode<T>* find(TreeNode<T>* node)const
    {
        return find(root(), dynamic_cast<GTreeNode<T>*>(node));
    }

    GTreeNode<T>* find(const T& value)const
    {
        return find(root(), value);
    }

    GTreeNode<T>* root()const
    {
        return dynamic_cast<GTreeNode<T>*>(this->m_root);
    }
};
}
#endif // GTREE_H
#include <iostream>
#include "GTree.h"

using namespace std;
using namespace XiebsLib;

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

    t.find(0);
    t.find(&tn);
    return 0;
}
  • 小结:
    1、查找操作是树的关键操作之一
    2、基于数据元素的查找课判断值是否存在于树中
    3、基于结点的查找可判断树中是否存在指定节点
    4、插入操作和删除操作都依赖于查找操作
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值