返回结点值为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 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
随机推荐
- Failed to read artifact descriptor for xxx:jar的问题解决
在开发的过程中,尤其是新手,我们经常遇到Maven下载依赖jar包的问题,也就是遇到“Failed to read artifact descriptor for xxx:jar”的错误. 对于这种非 ...
- cherry-pick 命令
拣选会提取某次提交的补丁,之后尝试将其重新应用到当前分支上. 这种方式在你只想引入特性分支中的某个提交时很有用. 假设你的项目提交历史如下: 如果你希望将提交 e43a6 拉取到 master 分支, ...
- Gradle编译报错
问题重现 gradle build A problem occurred evaluating root project 'Spring4WebSocket'. > Failed to appl ...
- Tomcat假死的原因及解决方案
服务器配置:linux+tomcat 现象:Linux服务器没有崩,有浏览器中访问页面,出现无法访问的情况,没有报4xx或5xx错误(假死),并且重启tomcat后,恢复正常. 原因:tomcat默认 ...
- c#不同数组之间的转换【转载,消化自动删除】
c#中从string数组转换到int数组 string[] input = { "1", "2", "3", "4", ...
- shell脚本${}、##和%%使用范例
file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值: ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.fi ...
- 洛谷1984 [SDOI2008]烧水问题
一道找规律 原题链接 显然要将烧得的温度最大化利用,即每次都去热传递. 设水沸腾为\(x\). 第一杯直接烧水,需提高\(x\). 第二杯先与第一杯进行热传递,这样只需提高\(\dfrac{x}{2} ...
- iOS8 UIAlertView键盘闪一下的问题
if (SYSTEM_VERSION >= 8.0) { UIAlertController *alertCtrl = [UIAlertController alertControllerWit ...
- mysql 5.7.17 建立主从数据库
---恢复内容开始--- 1.确定主/从数据库地址; 2.将主数据库的database dump出来 windows平台用workbench; 其他可以参考: 这位同仁写的比较详细了.我就不谢了.打开 ...
- centos7 搭建vnc服务