返回结点值为e的二叉树指针
题意为,如果二叉树某结点的值为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的二叉树指针的更多相关文章
- 剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
1 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用 ...
- 剑指Offer 24. 二叉树中和为某一值的路径 (二叉树)
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
- LeetCode-祖父节点值为偶数的结点值之和
祖父节点值为偶数的结点值之和 LeetCode-1315 这题稍微难度有点大,但是仔细思考还是可以找到思路的. 因为只需要找到祖父节点这最上两层,所以可以带一个参数记录一下祖父节点是否是偶数,以及父节 ...
- [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 ...
- Zend引擎探索 之 PHP中前置递增不返回左值
首先来讲,一般我们对"左值"的理解就是可以出现在赋值运算符的左侧的标识符,也就是可以被赋值.这样讲也许并不十分确切,在不同的语言中对左值的定义也不尽相同.在这里我们讨论前置递增(和 ...
- c++值传递和引用及指针传递区别
以下程序各有何问题? ***************************************************************************************** ...
- 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用
先看第一种情况:返回一个局部对象的引用.它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的.也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的.所谓生命空间,是指它们所在的 ...
- oracle学习-存储过程返回一个值,和返回一个结果集
一.返回一个值 --创建存储过程 create or replace procedure sp_hu_test(spcode in varchar2,spname out varchar2)is be ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
随机推荐
- mysql decimal(10,2)对应java类型
下面我给出MYSQL类型与JAVA类型对应表,希望能够帮到您: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.S ...
- Js 怎么遍历json对象所有key及根据动态key获取值(根据key值获取相应的value值)
Js代码 <script type="text/javascript"> getJson('age'); function getJson(key){ var json ...
- C#做一个写txt文件流的测试,为什么配置低的机器写入的还快
测试机:笔记本i7 8G 固态硬盘 由于采取读码写入txt方式, 读码频率挺高,文件名为日期格式,当前采用每次读码打开文件写入的方式, 为什么没用sb,因为怕断电情况的数据丢失.所以采取每条存入的方式 ...
- Android开发之使用GridView+仿微信图片上传功能(附源代码)
前言:如果转载文章请声明转载自:https://i.cnblogs.com/EditPosts.aspx?postid=7419021 .另外针对有些网站转载本人的文章结果源码链接不对的问题,本人在 ...
- OpenGL3D图形、旋转、纹理、键盘移动、光照、滤波、透明(完整) 转自http://www.cnblogs.com/tiandsp/archive/2012/01/23/2329049.html
#include <windows.h> // Windows的头文件 #include <stdio.h> #include <gl\gl.h> // OpenG ...
- Activity(活动)
- Android.StructureOfAndroidSourceCodeRootTree
Refference 1. How to understand the directory structure of android root tree? http://stackoverflow.c ...
- 让delphi像C语言一样灵活
lazarus是免费的delphi 拥有和c语言一样的灵活性,见代码: procedure TForm1.FormCreate(Sender: TObject);var p:PIntegerArray ...
- maven项目springmvc导包失败-JsonProcessingException
昨天搞了好久还是没有解决,今天把springaop小demo敲一遍时,启动tomcat时报错: org.springframework.beans.factory.BeanCreationExcept ...
- Git使用基础篇(zz)
Git使用基础篇 您的评价: 收藏该经验 Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体 ...