精华内容
下载资源
问答
  • 二叉树建立

    2015-05-12 14:15:05
    如何建立二叉树以及二叉树的三种遍历方法。
  • 大型二叉树建立与遍历系统\大型二叉树建立与遍历系统.
  • 基于二叉排序树的二叉树建立
  • 二叉树建立遍历

    2018-01-03 09:30:41
    二叉树建立遍历,输入后可以输出二叉树的中序和后序遍历。
  • 二叉树建立的输入问题

    万次阅读 2018-09-24 15:32:10
    这几天在看数据结构的二叉树,被二叉树建立时的输入问题困扰很久。二叉树的建立一般使用递归算法,将所有节点的数据一股脑的输入,递归无法停止,二叉树就无法建立。 感谢此博文,原来我们在输入节点数据的时候,...

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

    感谢此博文,原来我们在输入节点数据的时候,必须输入空闲叶子节点,并用特殊符号标记,比如上述的博文的空闲叶子节点采用‘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;
    }

    展开全文
  • 数据结构试验3二叉树建立,遍历等操作代码及运行结果。 实验内容: 采用二叉链表存储,实现二叉树的创建、遍历(递归)、赫夫曼编码和译码等典型操作。 1. 编程实现如下功能: (1)假设二叉树的结点值是字符型,...
  • 数据结构 C++ 二叉树建立 类与对象的方法
  • 我们对二叉树建立, 一般使用的方法是递归建立,这样的代码量最小,也最容易理解,但是这会牵扯到修改指针的值的问题,在看书中源码之时,我一直不太理解那段代码: typedef struct BiTNode { TElemType data; ...

    我们对二叉树建立, 一般使用的方法是递归建立,这样的代码量最小,也最容易理解,但是这会牵扯到修改指针的值的问题,在看书中源码之时,我一直不太理解那段代码:

    typedef struct BiTNode
    {
           TElemType data;
           struct BiTNode *lchild, *rchild;
    } BiTNode, *BiTree;
    
    void CreateBiTree(BiTree* T)                   //传入的是指向指针的指针
    {
            TElemType ch;
            scanf("%c",&ch);
            if(ch == #')
            {
                  *T = NULL;
            }
            else
            {
                  *T = (BiTree )malloc( sizeof(BiTNode));
                  (*T)->data = ch;
                  CreateBiTree(&(*T)->lchild);
                  CreateBiTree(&(*T)->rchild);
            }
    }
    

    我一直很好奇,为什么我需要在这个递归建立二叉树的函数中传入指针的指针,因为我认为,我只需要传入节点的孩子就可以了,不需要传入指向孩子的指针。

    所以,很荣幸,程序马上就崩溃了,我经历过反复调试,才发现,原来节点的左右孩子指针完全没有改变,这时我才明白,为什么需要传入指向指针的指针,原来我需要在函数中改变指针的值,也就是对指针进行重新赋值,并且这个副作用需要影响到实参。

    这个程序加深了我对指针这个概念的理解,本身我对于指针的理解就是通过指针我可以改变指针指向的元素的值,而对于指针的指针我并不熟悉,因为我不清楚这个到底是需要使用在哪里。

    如果你需要在函数中修改指针的值,而不是指针指向的元素的值,那么这个指针对于你来说就是一个元素,你在函数中获得的这个指针是原来指针的副本,只是指向同一个地址,所以你可以借助这个副本指针去修改实参中的值,但是你直接修改指针的值(改变指针指向的地址)是无法对实参产生影响的,因为他只是个副本指针。

    转载:
    链接:https://www.jianshu.com/p/413ca3926c1b

    展开全文
  • 二叉树建立及其遍历

    2018-11-26 23:36:03
    C实现二叉树建立及先中后序的遍历,控制台程序,在各版本vs上均可运行
  • 数据结构中二叉树建立以及递归、非递归遍历实现C代码
  • 链式二叉树建立 //链式二叉树的建立 VS2017种存在scanf与scanf_s的区别 修改项目文件的sdl check为否 加入如下这句 #define _CRT_SECURE_NO_WARNINGS # include &lt;stdio.h&gt; # include &lt;...

    链式二叉树建立

    //链式二叉树的建立  VS2017种存在scanf与scanf_s的区别 修改项目文件的sdl check为否 加入如下这句
    #define _CRT_SECURE_NO_WARNINGS
    
    # include <stdio.h>
    # include <stdlib.h>
    
    struct BiTree
    {
    	char data;
    	struct BiTree* lchild;
    	struct BiTree* rchild;
    };
    
    void CreateBiTree(struct BiTree **T);
    void PreTraverse(struct BiTree*T);
    
    int main(void)
    {
    	struct BiTree *T = NULL;
    	CreateBiTree(&T);
    	PreTraverse(T);
    	system("pause");
    	return 0;
    }
    
    
    void PreTraverse(struct BiTree*T)
    {
    	printf("遍历输出的结果\n");
    	if (NULL != T)
    	{
    		printf("%c ", T->data);
    		if (NULL != T->lchild)
    			PreTraverse(T->lchild);
    		if (NULL != T->rchild)
    			PreTraverse(T->rchild);
    	}
    	else
    		printf("空树\n");
    }
    
    //默认前序输入一棵二叉树,以#代表空格
    void CreateBiTree(struct BiTree **T)
    {
    	char ch;
    	printf("请前序输入一棵二叉树:\n");
    	scanf("%c", &ch);
    	if ('#' == ch)
    		*T = NULL;
    	else
    	{
    		*T = (struct BiTree*)malloc(sizeof(struct BiTree));
    		if (NULL == *T)
    		{
    			printf("内存分配失败\n");
    			exit(-1);
    		}
    		(*T)->data = ch;
    		CreateBiTree(&(*T)->lchild);
    		CreateBiTree(&(*T)->rchild);
    	}
    }

     

    线索二叉树建立

    # include <stdio.h>
    # include <stdlib.h>
    
    typedef char ElemType;
    
    //线索存储标志位
    //Link(0), 表示指向左右孩子的指针
    //Thread(1), 表示指向前驱后继的线索
    
    typedef enum {Link, Thread}PointerTag;
    
    
    typedef struct BiThrNode
    {
    	ElemType data;
    	struct BiThrNode *lchild, *rchild;
    	PointerTag ltag;
    	PointerTag rtag;
    }BiThrNode, *BiThrTree;
    
    void InThreading(BiThrTree p);
    void InOrderThreading(BiThrTree *p, BiThrTree T);
    void CreateBiThrTree(BiThrTree *T);
    
    //创建一棵二叉树,约定用户遵照前序遍历的方式输入数据
    void CreateBiThrTree(BiThrTree *T)
    {
    	ElemType c;
    
    	scanf("%c", &c);
    	if ('#' == c)
    		*T = NULL;
    	else
    	{
    		*T = (BiThrTree)malloc(sizeof(BiThrNode));
    		if (NULL == *T)
    		{
    			printf("内存分配失败\n");
    			exit(-1);
    		}
    		(*T)->data = c;
    		(*T)->ltag = Link;
    		(*T)->rtag = Link;
    		CreateBiThrTree(&(*T)->lchild);
    		CreateBiThrTree(&(*T)->rchild);
    	}
    }
    
    BiThrTree pre; //全局变量,始终指向刚刚访问过的节点
    //中序遍历进行中序线索化
    void InThreading(BiThrTree p)
    {
    	if (p)
    	{
    		InThreading(p->lchild); //递归左子树线索化
    		if (!p->lchild) //没有左孩子
    		{
    			p->ltag = Thread;// 前驱线索
    			p->lchild = pre; //左孩子指针指向前驱
    		}
    		if (!pre->rchild); //前驱没有右孩子
    		{
    			pre->rtag = Thread; //后继线索
    			pre->rchild = p; //前驱右孩子指针指向后继(当前节点p)
    		}
    		pre = p; //移动前驱, 保持pre指向p的前驱
    		InThreading(p->rchild); //递归右子树线索化
    	}
    }
    
    void InOrderThreading(BiThrTree *p, BiThrTree T)
    {
    	*p = (BiThrTree)malloc(sizeof(BiThrNode));
    	(*p)->ltag = Link;  // 头节点的左指针指向左孩子标志位
    	(*p)->rtag = Thread; //头节点的右指针指向线索标志位
    	(*p)->rchild = *p; // 右指针回指
    	if (!T) //如果是空树
    	{
    		(*p)->lchild = *p; //左指针回指
    	}
    	else
    	{
    		(*p)->lchild = T; // 左指针指向 根节点
    		pre = *p; //pre(前驱)的初值指向头节点
    		InThreading(T); // 中序遍历进行中序线索化, pre指向中序遍历的最后一个结点
    		pre->rtag = Thread; // 最后一个结点的右标志为线索
    		pre->rchild = *p; // 最后一个结点的右指针指向头结点
    		(*p)->rchild = pre; // 头结点的右指针指向中序遍历的最后一个结点
    	}
    }
    
    //中序遍历二叉树,非递归
    void InOrderTraverse(BiThrTree T)
    {
    	BiThrTree p;
    	p = T->lchild;
    	while (p != T)
    	{
    		while (p->ltag == Link)
    		{
    			p = p->lchild;
    		}
    		printf("%c", p->data);
    		while (p->rtag == Thread && p->rchild != T)
    		{
    			p = p->rchild;
    			printf("%c", p->data);
    		}
    		p = p->rchild;
    	}
    
    }
    int main()
    {
    	BiThrTree P, T = NULL;
    	printf("请前序输入一棵二叉树\n");
    	CreateBiThrTree(&T);
    	InOrderThreading(&P, T);
    	printf("中序遍历的结果为\n");
    	InOrderTraverse(P);
    	printf("\n");
    	system("pause");
    	return 0;
    }

    TODO

    • 清空树
    • 销毁树
    • 中序递归遍历
    • 前序建立树和遍历
    • 后序建立树和遍历

     

    展开全文
  • 0个数据结构课程设计例子 查找.c 二叉排序树.c 二叉树层次遍历.c 二叉树非递归遍历.c 二叉树建立.c 快速排序.c 括号匹配.c 冒泡排序.c 直接插入排序.c 直接选择排序.c
  • 线索二叉树建立

    2019-05-04 19:56:32
    今天学习了线索二叉树建立,于是走了一遍代码 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; /* 二叉树线索存储结构的定义 Link=0;...

    今天学习了线索二叉树的建立,于是走了一遍代码

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    using namespace std;
    /*
    二叉树线索存储结构的定义
    Link=0;代表指向左右孩子的指针
    Thread=1,  代表指向前驱或者后继的线索
    */
    typedef enum{Link,Thread}PointerTag;//枚举类型
    typedef char TypeData;
    //创建一个树的结构体
    typedef struct BiTreeNode{
    TypeData data;//树的数据部分
    struct BiTreeNode *lchild,*rchild;//树的左右孩子
    PointerTag LTag;//左右标志域
    PointerTag RTag;
    }BITREENODE;
    BITREENODE* createBiTree();//创建二叉树
    void preOrderBiTree(BITREENODE* T);//前序遍历二叉树
    void InThreadBiTree(BITREENODE *T);//中序线索遍历二叉树
    void InOrderBiTree_Thread(BITREENODE *T);//中序遍历二叉树
    //创建二叉树
    BITREENODE *createBiTree(){
    TypeData ch=0;
    BITREENODE *pNewNode=NULL;
    cin>>ch;
    if(ch=='#')//输入#截止
    {
    pNewNode=NULL;
    }
    else{
    //给结点分配内存
    pNewNode=(BITREENODE *)malloc(sizeof(BITREENODE));
    pNewNode->data=ch;//给数据域赋值
    pNewNode->LTag=pNewNode->RTag=Link;//创建结点时,标志位都是0
    //采用递归的思想创建左右子树
    pNewNode->lchild=createBiTree();//创建左子树
    pNewNode->rchild=createBiTree();//创建右子树
    }
    return pNewNode;
    }
    //前序遍历二叉树
    void preOrderBiTree(BITREENODE *T){
    if(T){
    cout<<T->data<<" ";
    preOrderBiTree(T->lchild);
    preOrderBiTree(T->rchild);
    }
    }
    /*
    中序遍历线索二叉树
    */
    BITREENODE *pre=NULL;//全局变量 ,始终指向刚刚访问过的结点
    void InThreadBiTree(BITREENODE * T){
    if(T){
    //递归线索化左子树
    InThreadBiTree(T->lchild);
    //如果没有左孩子
    if(!T->lchild)
    {
    T->LTag=Thread;//如果没有左孩子,那么将前驱标志位设为1,这样左孩子区域就指向前驱
    T->lchild=pre;//
    }
    //前驱没有右孩子
    if(pre!=NULL&&pre->rchild==NULL)//前驱没有右孩子
    {
    pre->RTag=Thread;//将后驱标志位设为1
    pre->rchild=T;//前驱的右孩子指向后继
    }
    //保持pre指向T的前驱
    pre=T;
    //递归右子树线索化
    InThreadBiTree(T->rchild);
    }
    }
    //中序遍历该线索二叉树
    void InOrderBiTree_Thread(BITREENODE *T){
    BITREENODE *p=T;
    while(p!=NULL){
    //当LTag==0时循环到中序序列的第一个结点
    //一路向下遍历
    while(p->LTag==Link){
    p=p->lchild;
    }
    //打印出该结点的数值
    cout<<p->data<<" ";
    //打印出当前结点的后继
    while(p->RTag==Thread&&p->rchild!=NULL){
    p=p->rchild;
    cout<<p->data<<" ";
    }
    //指向该结点的后继
    p=p->rchild;
    }
    cout<<endl;
    }
    int main(void){
    BITREENODE *pRoot=NULL;
    //创建二叉树
    pRoot=createBiTree();
    //前序遍历该二叉树,这时候还没有线索化二叉树  可以这样进行前序遍历
    preOrderBiTree(pRoot);
    cout<<endl;
    //中序线索化该二叉树
    InThreadBiTree(pRoot);
    InOrderBiTree_Thread(pRoot);
    return 0;
    }
    
    [添加链接描述](https://blog.csdn.net/weixin_37818081/article/details/78545843)`
    
    
    展开全文
  • (1)输入字符序列,建立二叉链表。 (2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 ...
  • 数据结构中的二叉树建立和查找的功能的实现,对于平常的课程设计还是绰绰有余的。
  • 数据结构课程设计二叉树建立和中序遍历,有些也是下载别人的,
  • 建立二叉树,实现二叉树的先序、中序、后序的递归遍历算法,输出遍历结果。 实现二叉树的先序、中序、后序和层次遍历的非递归算法,输出遍历结果。
  • 10个数据结构课程设计实例二叉树建立遍历冒泡排序快速排序等.rar
  • 二叉树建立与遍历

    2012-05-19 19:03:34
    数据结构(对C语言的描述)有关二叉树建立与遍历(算法源代码) 包括其中序、后序、先序遍历及二叉树的两种建立方法
  • C语言_二叉树建立、遍历、交换子树代码、是可执行的源代码,欢迎大家下载
  • 搜索二叉树建立

    2018-03-03 19:39:30
    树结构练习——排序二叉树的中序遍历Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有...
  • 二叉树建立及遍历

    2019-04-12 10:23:46
    二叉树建立以及遍历 利用递归的方式建立二叉树 并以中序遍历的方式读取数据,根据遍历二叉树的三种方式,只需要在递归时修改访问结点的元素即可。 #include <stdio.h> #include <stdlib.h> ...
  • 线索二叉树建立及遍历 线索二叉树概念 二叉树通过二叉链表作为存储结构时,只能得到当前结点的左右孩子信息,而无法得到结点在任一序列的前驱和后继,如果想要保存遍历中的信息,需要在每个结点上添加两个指针域...
  • 二叉树建立和遍历

    2013-07-02 10:00:03
    以二叉链表存储二叉树,按照完全二叉树的编号顺序输入节点,创建二叉树,最后,给出三种遍历的结果
  • 平衡二叉树建立

    千次阅读 2018-03-03 19:33:56
    数据结构实验之查找二:平衡二叉树Time Limit: 400 ms Memory Limit: 65536 KiB#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; struct node { int ...
  • Java实现二叉树建立以及三种遍历 public class BinTree { static int[] array = {1,2,3,4,5,6,7,8,9}; static List nodelist = null; /*二叉树节点*/ public static class Node { Node leftChirld; Node ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,998
精华内容 3,999
关键字:

二叉树建立