关于二叉排序树树建立并返回根节点

今天做了一道题,发现需要返回根节点,不想多想,就上网搜了一下,发现其中提供的办法都是需要使用父节点,其实并不需要使用父节点。

只需要使用递归函数返回值就可以

struct  T{
    int x;
    T *lchild,*rchild;
};
T* init(T* &t){//树t的初始状态为t=NULL;e==0说明没有叶子节点
    int e;
    scanf("%d",&e);
    if(e==0)t=NULL;
    else {
        t=new T;
        t->x=e;
        init(t->lchild);
        init(t->rchild);
    }
    return t;
}
    

建立二叉排序树

struct T{
    int x;
    T *lchild,*rchild;
};
T* insert(T* &t,int data){
    if(!t){
        t=new T;
        t->x=data;
        t->lchild=t->rchild=NULL;
    }
    else if(t->x>data)insert(t->lchild,data);
    else if(t->x<data)insert(t->rchild,data);
    return t;
}
T* init(T* &t){//<span style="font-family: 'Courier New', Courier, monospace; font-size: 14px; white-space: pre-wrap;">1 4 3 2 9 7 18 22 0   0代表输入结束</span>
    int e;
    while(scanf("%d",&e)&&e)
        t=insert(t,e);
    return t;
}

这里介绍一下指针,指针的引用。

函数参数的传递的是传值,指针因为传的是地址,所以形参与实参共同指向一个变量,修改形参的值,变量的值也就得到了修改

#include <cstdio>
struct T{
    int x;
    T *lchild,*rchild;
};
void init(T* t){
    T *p=new T;
    p->x=2;
    p->rchild=p->lchild=NULL;
    t->lchild=p;
    p=new T;
    p->x=3;
    p->rchild=p->lchild=NULL;
    t->rchild=p;
}
void in(T* head){
    if(head){
        in(head->lchild);
        printf("%d ",head->x);
        in(head->rchild);
    }
}
int main()
{
    T p;
    T *head=&p;
    head->x=1;
    head->rchild=head->lchild=NULL;
    init(head);
    in(head);
}//输出2 1 3

输出说明了修改了head指向的变量也就是变量p的值。

加引用其实就是相当于传指针的效果,看下面

#include <cstdio>
void fun(int &x,int y,int* z){
    x=4;
    y=5;
    *z=6;
    return;
}
int main(){
    int a=1,b=2,c=3;
    printf("%d %d %d\n",a,b,c);
    fun(a,b,&c);
    printf("%d %d %d\n",a,b,c);
    return 0;
}
/*
1 2 3
4 2 6

Process returned 0 (0x0)   execution time : 0.169 s
Press any key to continue.
*/

修改了第一个和第三个的值,那么就可以理解为引用就是指针的便捷方式。

#include <cstdio>
struct T{
    int x;
    T *lchild,*rchild;
};
void init(T* &t){
    t=NULL;
}
void in(T* head){
    if(head){
        in(head->lchild);
        printf("%d ",head->x);
        in(head->rchild);
    }
}
int main()
{
    T p;
    T *head=&p;
    head->x=1;
    head->rchild=head->lchild=NULL;
    printf("%x\n",head);
    init(head);
    printf("%x",head);
    //in(head);
}
//没引用输出28ff10   28ff10
//有引用输出28ff14   0

总结如下:形参为T &t,修改的是实参的值;形参为T *t,修改的是实参地址所指向的变量的值;形参为T* &t,修改的是实参的值,也就是指针的值。

所以在数据结构课程中递归建立树中(如第一段代码)如果没有加引用那么在递归函数的第一层中会修改树根的值x,在调用建立子树的时候因为根节点的孩子存储的是^,那么在函数调用的时候只是传入了^,  修改了^所指向的内容,也就当然没用了。

不用引用动态建树

#include <cstdio>
struct T{
    int x;
    T* lchild;
    T* rchild;
};
void init(T* t,int e){
    while(t->rchild||t->lchild){
            if(t->x>e&&!t->lchild)break;
            if(t->x<e&&!t->rchild)break;
            if(t->x>e){t=t->lchild;}
            if(t->x<e){t=t->rchild;}
    }
    if(t->x>e){
        t->lchild=new T;
        t->lchild->x=e;
        t->lchild->lchild=t->lchild->rchild=NULL;
    }
    else {
        t->rchild=new T;
        t->rchild->x=e;
        t->rchild->lchild=t->rchild->rchild=NULL;
    }
}
void in(T* t){
    if(t){
        in(t->lchild);
        printf("%d ",t->x);
        in(t->rchild);
    }
}
int main()
{
    int e;
    T* t=new T;
    t->lchild=t->rchild=NULL;
    scanf("%d",&e);
    t->x=e;
    while(scanf("%d",&e)&&e)
        init(t,e);
    in(t);
    return 0;
}

输入以0结尾;

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 05:43:18

关于二叉排序树树建立并返回根节点的相关文章

easyui 获取树的平级根节点

1.easyui的树的根节点一般是几个平级的,怎样获取这些父节点的id? 可以将获取到的平级根节点放在一个数组中 var roots=[]; roots=$("#tree1").tree("getRoots",node.target); 这样得到的roots是一个包含了所有平级的根节点的数组 然后就可以遍历这个数组 for(var i=0;i<roots.length;i++){ roots[i].id } 2.怎样选择性地展示easyui树的一个根节点? 思

ORACLE 树形遍历查询根节点、父节点、子节点

1.准备演示数据 创建表结构: -- Create table createtable Z_ORG(  cid         NUMBER,  cname       VARCHAR2(32),  parent_id   NUMBER,  create_time DATE,  org_level   NUMBER) tablespace POWERDESK pctfree10 initrans1 maxtrans255; -- Add comments to the table comment

PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

<pre class="code"><span style="font-family: %value; font-size: 14px;">03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each inpu

LeetCode:Path Sum - 树的根节点到叶节点的数字之和

1.题目名称 Path Sum(树的根节点到叶节点的数字之和) 2.题目地址 https://leetcode.com/problems/path-sum/ 3.题目内容 英文:Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. 中文:给定一颗二叉树,如

Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点

Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点的 json 报文 问题 问题描述起来比较拗口,其实就是用Spring MVC时,如何将对象映射成 json 报文时不把对象作为json的根节点.即使用@ResponseBody的效果. 比如,默认情况下,使用ModelAndView的addObject(key,object)或者ModelMap的addAttribute(key,object)保存完Java对象,然后交给Srping的视图解析器解析成json时,

【转】将一棵树转换为二叉树后,为什么根节点没有右子树

树转化为二叉树时结点左子树是原来的孩子结点,右子树是原来的兄弟结点.即取根节点左孩子向右连接他的兄弟结点(在同一层次的节点,原来互不相连)并把它的子树,而把除左孩子外,原来与根节点相连的线擦除.这样根节点没有右孩子,因为由树转化来的二叉树某个节点A的左子树是原来作为树时A的孩子,其右子树是他的兄弟. 原文地址:https://www.cnblogs.com/schips/p/10630811.html

hdoj 2121 Ice_cream’s world II 【没有最低树的根节点】

称号:pid=2121" target="_blank">hdoj 2121 Ice_cream's world II 题意:题目是一道躶题,给n个点,m条边的有向图.然后找一个点.到全部点的距离和最小.找出这个点并输入距离. 分析:非常明显是求一个最小树形图,可是没有说根节点.要找跟节点,我们能够虚拟一个节 点 x .x 到全部节点连边距离为前面全部距离和+1为 dis . 然后从x 节点求一次最小树形图为ans,则ans - dis 就是最小树形图的距离. 假设图不

腾讯笔试题:满二叉排序树,任给3个子节点,找他们最大的公共父节点

腾讯笔试题出现了和这个类似的题目,没做出来,现在来好好解决这个问题吧,先从基本的开始. 先吐槽一下:感觉算法设计什么的,真的超级难,也许是我头脑太笨,转不过弯来吧,呵呵. 题目是这样的:一棵满二叉排序树,有K层,节点的值依次为 1~2k-1.现在告诉你树的高度是4层,给定你3个节点,比如9,11, 13,那么最大的公共父节点是12. 现在想起来这题我已经想出来一半了呀,但是大概人在紧张的时候大脑会思维短路,跳不出原有的思维陷阱.想法是这样的: 1. 首先是从根节点开始,如果给的三个叶节点的值其中

二叉树中所有的路径(从根节点到叶子结点)

1 import java.util.ArrayList; 2 3 /** 4 * 寻找最短的二叉搜索的路径,从根节点到叶子结点 5 * 6 * @author jinfeng 7 * 8 */ 9 public class FindShortestBTPath { 10 11 // 用来记录所有的路径 12 private ArrayList<ArrayList<Integer>> allPaths = new ArrayList<ArrayList<Integer&