题意为,如果二叉树某结点的值为e(假定是整型二叉树),返回这个结点的指针。初看这道题,联想到二叉树可以很简单的遍历,直接返回这个指针不就行了吗?
如下图所示,假如要返回值为3的结点指针:

设计好了一个函数

void Traverse(Tree &L,int e,Tree &q)
{
if(L)
{
if(L->data==e)
{
cout<<"找到了"<<endl;
q=L; /*辅助变量q保存指针*/
}
Traverse(L->left,e,q);
Traverse(L->right,e,q);
}
}

程序能正确运行,也确实返回了正确的指针值。可为什么书上没有采用这种方法呢?思考一下,不难发现这段程序的不利之处就在于,即使找到值之后它依然继续运行,一直遍历完整棵树!书上采用了一种非常巧妙的办法!

它的思路是,把结点放入队列,再检测该结点是否有左右子树,如果有,也放入队列。然后出列元素,看它的数据是否等于e,如此循环下去!
在这个循环中,判定的条件是:队列不为空!然后,出列元素(最左边),看它的值是否等于e,然后再检测它是否有左树,或者右树,如果有再入队列,这种方法很巧妙啊!

还有一个问题,就是这个队列需要多大的空间?规律是:出队一个,入队两个,(就按满二叉树的最多结点计算),所以队列中存在的结点数就会出现这种情况:
1  2  3  4  5  .........所以队列中的最大结点数就是,二叉树最底层的结点数,如,三层的满二叉树,底层有4个结点,则队列需要的节点最少为4,这样计算的原因是可能利用循环队列。

#include <iostream>
using namespace std;
#define MAXSIZE 16
typedef struct node
{
char data;
struct node *left,*right;
}*Tree,Node;
void creat(Tree &T) /*创建二叉树*/
{
char ch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T=(Tree)malloc(sizeof(Node));
T->data=ch;
creat(T->left);
creat(T->right);
}
} Tree LocateElem(Tree T,char e) /*查找=e的元素,返回其指针*/
{
Tree Q[MAXSIZE];
int front=,rear=;
Tree p;
if(T)
{
Q[rear]=T;
rear++;
while(front!=rear)/*队列不空*/
{
p=Q[front];/*出队*/
front=(front+)%MAXSIZE;
if(p->data==e)/*如果找到*/
return p;
if(p->left)/*左树入队*/
{
Q[rear]=p->left;
rear=(rear+)%MAXSIZE;
}
if(p->right)/*右树入队*/
{
Q[rear]=p->right;
rear=(rear+)%MAXSIZE;
}
}
}
return NULL;
}
void DestoryTree(Tree &T)
{
if(T)
{
DestoryTree(T->left);
DestoryTree(T->right);
free(T);
T=NULL;
}
}
int main()
{
Tree q;
Tree T;
creat(T);
if((q=LocateElem(T,'a'))!=NULL)/*返回指针*/
cout<<q->data;
else
cout<<"没有找到数据值为e的元素!"<<endl;
DestoryTree(T);
return ;
}

返回结点值为e的二叉树指针的更多相关文章

  1. 剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。

    1 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用 ...

  2. 剑指Offer 24. 二叉树中和为某一值的路径 (二叉树)

    题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...

  3. LeetCode-祖父节点值为偶数的结点值之和

    祖父节点值为偶数的结点值之和 LeetCode-1315 这题稍微难度有点大,但是仔细思考还是可以找到思路的. 因为只需要找到祖父节点这最上两层,所以可以带一个参数记录一下祖父节点是否是偶数,以及父节 ...

  4. [LeetCode] Find Largest Value in Each Tree Row 找树每行最大的结点值

    You need to find the largest value in each row of a binary tree. Example: Input: 1 / \ 3 2 / \ \ 5 3 ...

  5. Zend引擎探索 之 PHP中前置递增不返回左值

    首先来讲,一般我们对"左值"的理解就是可以出现在赋值运算符的左侧的标识符,也就是可以被赋值.这样讲也许并不十分确切,在不同的语言中对左值的定义也不尽相同.在这里我们讨论前置递增(和 ...

  6. c++值传递和引用及指针传递区别

    以下程序各有何问题? ***************************************************************************************** ...

  7. 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用

    先看第一种情况:返回一个局部对象的引用.它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的.也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的.所谓生命空间,是指它们所在的 ...

  8. oracle学习-存储过程返回一个值,和返回一个结果集

    一.返回一个值 --创建存储过程 create or replace procedure sp_hu_test(spcode in varchar2,spname out varchar2)is be ...

  9. 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

      您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...

随机推荐

  1. IOS安卓常见问题

    一.IOS自带safari浏览器   1.safari不支持fixed+input输入框.   解决方案: http://www.haorooms.com/post/ios_fixed_input   ...

  2. MongoDb进阶实践之九 Mongodb的备份与还原

    一.引言 前几天写了MongoDB数据库的聚合.一说到“聚合”,用过关系型数据库的人都应该知道它是一个什么东西,主要是用于对数据分类汇总和统计.大家都知道,做为DBA还有另一个重要的任务,那就是对数据 ...

  3. BZOJ4033或洛谷3177 [HAOI2015]树上染色

    BZOJ原题链接 洛谷原题链接 很明显的树形\(DP\). 因为记录每个点的贡献很难,所以我们可以统计每条边的贡献. 对于每一条边,设边一侧的黑点有\(B_x\)个,白点有\(W_x\),另一侧黑点有 ...

  4. BZOJ1233 干草堆 - 单调队列优化DP

    问题描述: 若有干个干草, 分别有各自的宽度, 要求将它们按顺序摆放, 并且每层的宽度不大于 它的下面一层 ,  求最多叠几层 题解: zkw神牛证明了: 底边最短, 层数最高         证明: ...

  5. VS2010下MFC的串口编程

    串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串 ...

  6. Qt5+VS2010的安装及使用

    在我的博客<Win7下Qt5的安装及使用>中讲解了win7下Qt5+MinGW的安装及使用,本节再讲解win7下Qt5+VS2010的安装及使用.利用Qt5+MinGW开发应用程序比较麻烦 ...

  7. 超详细的PS抠图方法

    步骤: 1.打开图片,根据图片的特点选择抠图工具: 2.在图像上找到第一个定点,要求定点要完全暴露在画布中,并且是清晰可见的顶点: 3.抠取图像时,多边形套索的定点以及边线应该向内1-2个像素,为了避 ...

  8. [RF]怎样用Robot Framework写好Test Case?

    1.介绍 这是一个关于如何用Robot Framework写好Test Case的高层次的指导准则 怎样实际的与系统进行交互不在此文档范围内 最重要的准则是使测试用例尽可能的让熟悉此领域的人觉得简单易 ...

  9. Spring ConversionService 类型转换(二) ConversionService

    Spring ConversionService 类型转换(二) ConversionService Spring 系列目录(https://www.cnblogs.com/binarylei/p/1 ...

  10. tesseract-ocr如何训练Tesseract 4.0

    引自:https://blog.csdn.net/huobanjishijian/article/details/76212214 原文:https://github.com/tesseract-oc ...