精华内容
下载资源
问答
  • 如何自己构造二叉树输入用例?
    2021-12-26 21:08:30

    搜了挺多文章,没见到有用Java 写二叉树输入的,于是参照代码随想录的内容自己写了一个~~~

    public static void main(String[] args) {
        int[] nums = new int[]{4, 1, 6, 0, 2, 5, 7, -1, -1, -1, 3, -1, -1, -1, 8};
        TreeNode root = createNode(nums);
        List<List<Integer>> res = levelOrder(root);
        System.out.println(res);
    }
    
    // 根据数组构造二叉树
    private static TreeNode createNode(int[] nums) {
        TreeNode[] TreeArr = new TreeNode[nums.length];
        TreeNode root = null;
    
    
    // 把输入数值数组,先转化为二叉树节点数组
        for (int i = 0; i < nums.length; i++) {
            TreeNode node = null;
            if (nums[i] != -1) {
                node = new TreeNode(nums[i]);
            }
    
            TreeArr[i] = node;
            if (i == 0) {
                root = node;
            }
        }
        // 遍历一遍,根据规则左右孩子赋值就可以了
        // 注意这里 结束规则是 i * 2 + 2 < vec.size(),避免空指针
        for (int i = 0; i * 2 + 2 < nums.length; i++) {
            if (TreeArr[i] != null) {
    
    // 线性存储转连式存储关键逻辑
                TreeArr[i].left = TreeArr[i * 2 + 1];
                TreeArr[i].right = TreeArr[i * 2 + 2];
            }
        }
    
        return root;
    }
    
    private static List<List<Integer>> levelOrder(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode>queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()) {
            int count = queue.size();
            List<Integer> temp = new ArrayList<>();
    
            while(count >0) {
                TreeNode node = queue.poll();
                temp.add(node.val);
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
                count--;
    
            }
    
            res.add(temp);
        }
    
        return res;
    }
    
    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
    
        TreeNode(int x) {
            val = x;
        }
    }
    更多相关内容
  • printf("\t请输入树的各元素:\n\t"); CreateBiTree(T); do { printf(" /*****************************/\n"); printf("\t1键:先序输出; \n\t2键:中序输出;\n\t3键:后序输出!\n\t0键:退出程序!\n"); printf...
  • [问题描述] 建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数。 [基本要求] 要求根据读取的元素建立二叉树,能输出各种遍历。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。
  • 在学习二叉树时候发现了这个问题,只找到了解决方法,但没搞懂为什么,有哪位大佬知道可以评论。 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; typedef struct...

    在学习二叉树时候发现了这个问题,只找到了解决方法,但没搞懂为什么,有哪位大佬知道可以评论下。

    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    using namespace std;
    typedef struct BiTNode{
    	char data;
    	struct BiTNode *lchild, *rchild;
    }BiTNode, *BiTree;
    void CreateBiTree(BiTree &T) {     
    	char c;
    	//c = scanf("%c",&c);       这两种输入方式在这种命名函数中会陷入无终止的输入
    	//c = getchar();            后来我改用了cin输入字符就能结束了,ab##c##
    	cin >> c;   
    	if (c == '#')
    		T = NULL;
    	else {
    		T = (BiTNode*)malloc(sizeof(BiTNode));
    		T->data = c;
    		CreateBiTree(T->lchild);
    		CreateBiTree(T->rchild);
    	}
    }
    

    后来我尝试修改了下函数形式,用getchar()输入也成功了,但还是没弄明白原理

    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    using namespace std;
    typedef struct BiTNode{
    	char data;
    	struct BiTNode *lchild, *rchild;
    }BiTNode, *BiTree;
    BiTree creatTree() {
    	char c;
    	BiTNode *T;
    	//cin>>c;             在这个函数里cin>>就陷入了无终止输入,getchar()却是可行的,ab##c##
    	c=getchar();          
    	if (c == '#') {
    		T = NULL;
    	}
    	else
    	{
    		T = (BiTree)malloc(sizeof(BiTNode));
    		T->data = c;
    		T->lchild = creatTree();
    		T->rchild = creatTree();
    	}
    	return T;
    }
    

    我认为上面两个函数应该都可以的,一个是用引用做形参传入,另一个是返回指针,都能起到效果,但不同的输入单个字符函数在这两个函数里不能都有效,我在网上查找也没找到原因,望解答。

    展开全文
  • 二叉树建立输入问题

    万次阅读 2018-09-24 15:32:10
    感谢此博文,原来我们在输入节点数据的时候,必须输入空闲叶子节点,并用特殊符号标记,比如上述的博文的空闲叶子节点采用‘0’作为标记符,就能完整建立二叉树。 修改后的代码,亲测有效: #include&lt;...

    这几天在看数据结构的二叉树,被二叉树建立时的输入问题困扰很久。二叉树的建立一般使用递归算法,将所有节点的数据一股脑的输入,递归无法停止,二叉树就无法建立。

    感谢此博文,原来我们在输入节点数据的时候,必须输入空闲叶子节点,并用特殊符号标记,比如上述的博文的空闲叶子节点采用‘0’作为标记符,就能完整建立二叉树。

    修改后的代码,亲测有效:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    struct node
    {
    	char data;
    	node *left;
    	node *right;
    	node(){left=NULL;right=NULL;};
    };
    
    node *input()
    {
    	node *p;
    	char c;
    	scanf("%c",&c);
    	if(c=='#')
    	p=NULL;
    	else
    	{
    		p=new node;
    		p->data=c;
    		p->left=input();
    		p->right=input();
    	}
    	return p;
    }
    
    void pre(node *root)
    {
    	if(root)
    	{
    		char c;
    		c=root->data; 
    		printf("%c",c);
    		pre(root->left);
    		pre(root->right); 
    	}
    }
    
    void in(node *root)
    {
    	if(root)
    	{
    		char c;
    		c=root->data;
    		in(root->left); 
    		printf("%c",c);
    		in(root->right); 
    	}
    }
    
    void post(node *root)
    {
    	if(root)
    	{
    		char c;
    		c=root->data; 
    		post(root->left);
    		post(root->right);
    		printf("%c",c); 
    	}
    }
    
    int nodenum(node *root)
    {
    	if(root==NULL)
    	{
    		return 0;
    	}
    	else
    	{
    		return 1+nodenum(root->left)+nodenum(root->right);
    	}
    	
    }
    
    int leafnum(node *root)
    {
    	if(root==NULL)
    	{
    		return 0;
    	}
    	else if((root->left==NULL)&&(root->right==NULL))
    	{
    		return 1;
    	}
    	else
    	{
    		return leafnum(root->left)+leafnum(root->right);
    	}
    }
    
    int deep(node *root)
    {
    	if(root==NULL)
    	{
    		return 0;
    	}
    	else
    	{
    		return deep(root->left)>deep(root->right)?1+deep(root->left):1+deep(root->right);
    	}
    }
    
    int main()
    {
    	node *p;
    	p=new node;
    	p=input();
    	cout<<"先序遍历"<<endl; 
    	pre(p);
    	printf("\n");
    	cout<<"中序遍历"<<endl;
    	in(p);
    	printf("\n");
    	cout<<"后序遍历"<<endl;
    	post(p);
    	printf("\n");
    	
    	cout<<"节点数"<<nodenum(p)<<endl;
    	cout<<"叶子数"<<leafnum(p)<<endl;
    	cout<<"深度"<<deep(p)<<endl;
    	return 0;
    }

    展开全文
  • 创建二叉树

    千次阅读 2020-05-28 15:37:02
    创建二叉树 开发工具与关键技术: 作者: 撰写时间:2020年5月27日 一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两颗分别称为左子树和右子树的、相互不相交的二叉树组成,每个结点...

    创建二叉树

    开发工具与关键技术:

    作者:                      

    撰写时间:2020年5月27

     一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两颗分别称为左子树和右子树的、相互不相交的二叉树组成,每个结点最多只有两个孩子。

    二叉树的顺序存储结构,用一组连续的的存储单元存放二叉树中的元素,即按满二叉树的形式存放在一维数组中。

    由于在顺序储存结构中是以结点在数组中相对位置表示结点之间的关系,因此,一般二叉树也必须以完成二叉树的形式来储存,可能未造成坤存储空间的浪费。

    在二叉树的链式存储结构,最常用的是二叉链表和三叉链表,二叉链表的每个结点有一个数据与和两个指针域,一个指针指向左孩子,另一个指向右孩子。如下图所示:

    在创建二叉树之前首先要想到,二叉树的三种遍历方法或二叉树的者操作,是建立在这个内存已经有了这个二叉树的基础上来做的,但是事实上内存中没有这棵二叉树,是需要我们建立二叉树,那二叉树是如何创建的呢?.

    如果二叉树自已链表存储方式,首先第一个节点先根遍历,所以第一个节点肯定是根,然后到它的左子树B,B的左子树先根遍历是D,可是D的左右孩子为空,并且B的孩子为空,到A的右孩子C,C的左孩子是E,然后E的左右孩子是空,然后C的孩子是F,F的左右孩子都为空,这样整个二叉树的创建就完成了。

     

    下面我们来看一下创建二叉树的代码,它的序列是AB,用#代表空集,我们做的时候就需要输入字符,把字符判断一下,如果是为#,那么二叉树为空,首先要分配一个新的结点,另一个结点我们当成是跟,如果分配成功我们把ch赋值给data域,然后不断地递归创建它的左子树和右子树,其实这是一个递归的过程,我们再次输入一个数据域,这个数据域当作他的左子树,因为这是先根遍历先做左子树一直到空为止在做它的右子树。

     

     

     

    展开全文
  • 递归创建二叉树程序步骤详解

    千次阅读 2021-03-07 20:56:16
    首先上代码后面对代码经行分析。 代码 #include <stdio.h> #include <stdlib.h> typedef struct tree { char date;...void creat_tree(BiTree *T)//创建树 { char val; scanf("%c",&val);
  • 输入若干数据,以任意字母结束,以此数据建立有序二叉树,并先序遍历输出。
  • 关于中序创建二叉树

    千次阅读 2021-11-14 21:40:20
    本题有两个要求,首先,要用中序顺序建立二叉树。但问题在于,只用中序输入无法创建一个确定的二叉树,因为对于一个已知的中序遍历结果,由于根节点不确定性,所以可能会对应多种不同结构的二叉树,例子如下: ...
  • 用户输入相应的节点数据对二叉树的节点进行定义, 以‘#’代表空节点,以‘*’代表二叉树构建完成 图片中第一行为输入数据,第二行为中序遍历的结果,第三行为层次遍历的结果。 以下为样例代码: #include<...
  • 构建二叉树的函数代码如下,运行的时候发现第一次输入一个字符A,然后按回车,发现下次等待用户输入前打印了两条“please input the data”语句。因为输入A以后再调用这个函数,scanf直接在输入流里面读取了10(回车...
  • 力扣上如何自己构造二叉树输入用例?
  • /* 把树根指针置为空,即从空树开始建立二叉树 */ /* 每循环一次处理一个字符,直到扫描到字符串结束符\0为止 */ while(a[i] != '\0') { switch(a[i]) { case ' ': break; /* 对空格不作任何处理 */ case '(': if...
  • 最近用到数据结构,之前也没学过,跑到图书馆看了几个版本的书,但是都记不住,总感觉少了点什么,直到自己动手的时候才发现....完了,真的是啥也不会 于是到B站自己刷视频,边看边操作,同时也看了很多博主的文章...
  • 一.二叉树的创建算法  博主之所一把这两个算法放一起,原因是这两个...二叉树输入格式  要想计算机知道我们输入的是什么意思那我们的输入就一定得有一定的格式,下面我就来介绍一种相对于来说比较简单的格式  ...
  • 二叉树建树问题_如何输入节点

    千次阅读 2021-02-06 12:38:21
    是把T置为空结束输入,但是问题是只输入一个是不能结束的,是因为二叉树不是线性的他有leftchild和rightchild,把左孩子有孩子以及他们的子节点置空才可以。 最后是代码 #include<stdio.h> #include
  • 最近在学习二叉树,想着想着就写了一些小片段程序来加深自己的印象,由此就按照自己的想法决定写个二叉树先序创建的代码,按着自己的一些积累和想法最终完成了。感觉还是不太好,希望ge'wei'wei ...
  • 题目描述 编一个程序,读入用户...可能有多组测试数据,对于每组数据,输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。每个输出结果占一行。 样例输入 a#b#cdef##### a## 样例输出 a b f
  • 递归创建二叉树(C版)

    2021-05-15 18:08:45
    1. 明确每一步重复的任务:创建父结点,连接子结点 (1)申请一块树节点的内存空间 (2)将用户输入的数据赋值给申请的树节点 (3)确认申请树节点的左右子节点,在此处递归调用 2. 确认递归的形参和返回值 函数形式1...
  • 得到一串先根遍历的序列,其中*标识叶子节点的左右节点,非递归建立二叉树
  • 这个建立二叉树输入语句哪里不对嘛?输入的内容是12@@3@@。 输入之后并没有什么反应,并非机子的问题。 除了输入的问题,是不是还有其他的问题在呢?比如说其他版块是不是出错了呢? 烦请指教。
  • 层次遍历创建二叉树

    千次阅读 2020-09-06 19:43:25
    #include <iostream>...//新定义二叉树类型 typedef ElementType int; //用0表示没有结点 #define NoInfo 0 struct TNode{ ElementType data; BinTree left; BinTree Right; }; BinTree
  • C语言创建二叉树的方法(全)

    千次阅读 2021-07-08 16:07:04
    创建二叉树 前言 一、二叉树的链式储存 二、前序,中序,后序 中序和先序建立二叉树 #号法创建二叉树
  • 二叉树建立

    万次阅读 多人点赞 2019-03-20 20:57:36
    结束二叉树输入:如何结束创建二叉树的输入那;把二叉树补全 前序(输入):AB##C## 中序:#B#A#C# 后序:##B##CA 输出结果如下: 代码如下 #include<iostream> using namespace std; //定义节点 ...
  • leetcode 根据数组创建二叉树

    千次阅读 2021-11-14 09:51:55
    为了调试方便,需要在本地IDE上实现对二叉树创建。题目给出的是一个含有null的数组。 如: [5,4,8,11,null,13,4,7,2,null,null,5,1] 首先我们需要创建一个数组。注意由于包含null值,因此肯定不能用int整型数组...
  • 二叉树的性质我就不多说了,毕竟是笔记,直接上一点干货...创建一个二叉树,按二叉树带空指针的先序依次输入(解释:因为在创建时我要从根结点开始建立,并且返回这个树根结点,“树高万丈不忘根,人若辉煌不忘本嘛”
  • 分享给大家供大家参考,具体如下:学习算法中,探寻重建二叉树的方法:用input 前序遍历顺序输入字符重建前序遍历顺序字符串递归解析重建前序遍历顺序字符串堆栈解析重建如果懒得去看后面的内容,可以直接点击此处本...
  • 外部输入建立二叉树

    2021-03-09 16:06:13
    //外部输入建立二叉树 #include <iostream> #include<vector> using namespace std; //根据输入还原一颗二叉树,在运行界面输入 //输入数组的格式按照 没有结点的位置使用# 的先序遍历来输入 struct ...
  • C++创建二叉树(链)

    千次阅读 2020-07-31 22:33:59
    遍历所给的字符串,当一个元素后面紧跟着一个左括号"(",便代表着它有孩子结点,将这个元素入栈,去构造它的左子树和右子树,遇到",",表示右子树的开始,遇到")",表示一棵子树的结束。一个父亲结点的子树构造完成...
  • 非递归法创建二叉树

    2021-12-04 16:10:29
    非递归法创建二叉树 层次遍历二叉树

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,539
精华内容 11,415
关键字:

创建二叉树输入什么结束

友情链接: JSON_msg_interface.tar.gz