精华内容
下载资源
问答
  • #include <stdio.h> #include <malloc.h> #define maxsize 100 typedef struct node { char data; struct node *lchild,*rchild; } *bitree; bitree create() ...}
  • 二叉树创建-前言

    2016-01-19 09:40:32
    如果我自己都理不清一个算法的步骤,什么时候开始,什么时候结束,那么就不可能写出正确的代码。 解决一个算法或者操作的时候,首先想想,再拿出笔画一画,我的程序需要对输入数据做怎样的处理,我需要什么样的...


    如果我自己都理不清一个算法的步骤,什么时候开始,什么时候结束,那么就不可能写出正确的代码。


    解决一个算法或者操作的时候,首先想想,再拿出笔画一画,我的程序需要对输入数据做怎样的处理,我需要什么样的目标,通过哪些步骤才能最终形成这个目标呢?如果弄懂了这些步骤,那么一个正确的算法自然就出现了。所以,正确的算法或程序就是编程者的孩子,编写程序的人知道任何与自己孩子有关的事情。



    展开全文
  • 疑问:为什么我是无限制的输入数据:解答:二叉树需要有一定的规律,最起码节点的个数需要是2的n次方减一才能构成一个树 还有就是考虑空节点问题,叶节点的NEXT必须为空才能结束所以说必须将树设计好 才能输入....
    疑问:为什么我是无限制的输入数据:解答:二叉树需要有一定的规律,最起码节点的个数需要是2的n次方减一才能构成一个树 还有就是考虑空节点问题,叶节点的NEXT必须为空才能结束所以说必须将树设计好 才能输入. #include<malloc.h> // malloc()等
     #include<stdio.h> // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等
     #include<stdlib.h> // atoi(),exit()






    #define ClearBiTree DestroyBiTree // 清空二叉树和销毁二叉树的操作一样


    typedef struct BiTNode
     { 
        int data; // 结点的值
        BiTNode *lchild,*rchild; // 左右孩子指针
     }BiTNode,*BiTree;


    char Nil=0; // 设整型以0为空
    void visit(int e)
     { printf("%d ",e); // 以整型格式输出
     }
     void InitBiTree(BiTree &T)
     { // 操作结果:构造空二叉树T
       T=NULL;
     }


     void CreateBiTree(BiTree &T)
     { // 算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),
       // 构造二叉链表表示的二叉树T。变量Nil表示空(子)树。修改
       char number;
       scanf("%d",&number); // 输入结点的值
       if(number==Nil) // 结点的值为空
         T=NULL;
       else // 结点的值不为空
       { T=(BiTree)malloc(sizeof(BiTNode)); // 生成根结点
         if(!T)
           exit(0);
         T->data=number; // 将值赋给T所指结点
         CreateBiTree(T->lchild); // 递归构造左子树
         CreateBiTree(T->rchild); // 递归构造右子树
       }
     }


     void DestroyBiTree(BiTree &T)
     { // 初始条件:二叉树T存在。操作结果:销毁二叉树T
       if(T) // 非空树
       { DestroyBiTree(T->lchild); // 递归销毁左子树,如无左子树,则不执行任何操作
         DestroyBiTree(T->rchild); // 递归销毁右子树,如无右子树,则不执行任何操作
         free(T); // 释放根结点
         T=NULL; // 空指针赋0
       }
     }


     void PreOrderTraverse(BiTree T,void(*Visit)(int))
     { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1
       // 操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次
       if(T) // T不空
       { Visit(T->data); // 先访问根结点
         PreOrderTraverse(T->lchild,Visit); // 再先序遍历左子树
         PreOrderTraverse(T->rchild,Visit); // 最后先序遍历右子树
       }
     }


     void InOrderTraverse(BiTree T,void(*Visit)(int))
     { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
       // 操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次
       if(T)
       { InOrderTraverse(T->lchild,Visit); // 先中序遍历左子树
         Visit(T->data); // 再访问根结点
         InOrderTraverse(T->rchild,Visit); // 最后中序遍历右子树
       }
     }


      void PostOrderTraverse(BiTree T,void(*Visit)(int))
     { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
       // 操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次
       if(T) // T不空
       { PostOrderTraverse(T->lchild,Visit); // 先后序遍历左子树
         PostOrderTraverse(T->rchild,Visit); // 再后序遍历右子树
         Visit(T->data); // 最后访问根结点
       }
     }


     void main()
     {
       BiTree T;
       InitBiTree(T); // 初始化二叉树T
       printf("按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1 2 0 0 3 0 0\n");
       CreateBiTree(T); // 建立二叉树T
       printf("先序递归遍历二叉树:\n");
       PreOrderTraverse(T,visit); // 先序递归遍历二叉树T
       printf("\n中序递归遍历二叉树:\n");
       InOrderTraverse(T,visit); // 中序递归遍历二叉树T
       printf("\n后序递归遍历二叉树:\n");
       PostOrderTraverse(T,visit); // 后序递归遍历二叉树T
     }
    展开全文
  • 照着书上写的,但结果不对(正确结果是输入什么输出什么) ``` /*广度优先算法*/ #include #include using namespace std; void visit(char x) { cout; } template class BinaryTreeNode{ ...
  • 数据结构中的树——确切的说应该是二叉树,有个地方我很是纠结,那就是二叉树创建。不是在应用中,因为压根就没有机会应用他。...但还有一点就是要知道什么时候结束,所以又还要给一个标志位,当读到这个标志位时说

    数据结构中的树——确切的说应该是二叉树,有个地方我很是纠结,那就是二叉树的创建。不是在应用中,因为压根就没有机会应用他。而是在练习中。要学习二叉树,我总要先创建一个二叉树吧,(非排序二叉树)给你一批数据你怎样创建二叉树呢?像数组一样从键盘上一个一个输入是行不太通的。比较好的办法还是先放在数组中,然后再通过数组创建二叉树。但还有一点就是要知道什么时候结束,所以又还要给一些标志位,当读到这个标志位时指针指向0.其父节点便是叶子节点。所以总感觉别扭。当然这只是自己个人的偏见,树在现实生活中还是很有用的。所以要好好学习!至于写法,个人觉得还是只要理解了思想,完全可以写出自己是水平,写出自己的风格!把各种结构都写成类,便于以后的调用。下面是一些和二叉树的性质有关的算法,因为比较抽象,所以建议画图,这样比较直观,比较好理解。

    一,创建二叉树:

    1,构造方法

            BiTree(){root=0;}//无参构造函数生成空树
    	BiTree(T tree[],int n,T flag)//有参构造函数
    	{
    		this->root=0;             
    		create(this->root,tree,1,n,flag);  //调用函数create()构造二叉树
    	}
    2,创建方法
    	//构造二叉树,tr[]是顺序表示的二叉树节点值。如果tr[i]表示节点p,
    	//则tr[2*i]表示p的左子树,tr[2*i+1]表示p的右子树,flag表示空节点在
    	//数组tr[]中的值
    	void create(BiNode<T> *&rt,T tr[],int i,int n,T flag)
    	{
    		if(rt!=0) DelTree(rt);//如果不为空,则删除rt
    
    		if(i<1 || i>n)  
    			return ;
    		else if(tr[i]==flag)  
    			return ;
    		else
    		{
    			rt=new BiNode<T>();
    			rt->data=tr[i];
    			rt->left=0;
    			rt->right=0;
    			create(rt->left,tr,2*i,n,flag);//递归调用生成左子树
    			create(rt->right,tr,2*i+1,n,flag);//生成右子树
    		}
    	}
    二,树的销毁:

    	//析构函数,删除以root为根节点的二叉树
    	~BiTree()     
    	{
    		DelTree(root);
    	};
    	void DelTree(BiNode<T> *p)    //删除以p为根节点的二叉树
    	{
    		if(p==0)
    			return ;
    		else{
    			DelTree(p->left);
    			DelTree(p->right);
    			delete p;
    		}
    	};

    三,递归的先,中,后序遍历:

    	void preorder()         //先序遍历
    	{
    		preo(this->root);
    
    	}
    
    	void inorder()         //中序遍历
    	{
    		ino(this->root);
    	}
    
    
    	void postorder()       //后序遍历
    	{
    		posto(this->root);
    	}
    
    
    	void preo(BiNode<T> *root )//先序遍历
    	{
    		if(root==0) return ;
    		else{
    			cout<<root->data<<",";
    			preo(root->left);
    			preo(root->right);
    		}
    	}
    
    	void ino(BiNode<T> *root)//中序遍历
    	{
    		if(root==0) return ;
    		else{
    			ino(root->left);
    			cout<<root->data<<",";//中序遍历既在中间输出
    			ino(root->right);
    		}
    	}
    
    	void posto(BiNode<T> *root)//后序遍历
    	{
    		if(root==0) return ;
    		else{
    			posto(root->left);
    			posto(root->right);
    			cout<<root->data<<",";
    		}
    	}

    四,非递归的先序遍历:

    void PerOrderNotRecursionoper(BiNode<T>* root)// 先序遍历的非递归算法
    {
    	while(root||!st.IsEmpty())//如果跟节点不为0,堆栈不为空一直循环
    	{
    		while(root)
    		{
    			cout<<root->data<<"  ";//输出当前元素
    			st.Push(root);//入栈
    			root=root->left;//向左遍历
    		}
    		if (!st.IsEmpty())
    		{
    			st.Pop(root);//栈不为空时出栈
    			root=root->right;//指向左边的孩子
    		}
    	}
    }

    五,层序遍历:

    void LeveOrder()
    {
    	LeveOrderoper(root);
    }
    void LeveOrderoper(BiNode<T> * root)//层序遍历
    {
    	BiNode<T> *q ;
    	if (root)
    	{
    		qu.Enq(root);//节点不为空入队
    	}
    	while(!qu.IsEmpty())//当队不为空时一直循环
    	{
    		qu.Outq(q);//出队
    		cout<<q->data<<"   ";//输出当前节点的数据
    		if (q->left)
    		{
    			qu.Enq(q->left);//左孩子入队
    		}
    		if (q->right)
    		{
    			qu.Enq(q->right);//右孩子入队
    		}
    	}
    	//cout<<endl;
    }
    六,树的深度:

    	void Treehigh()
    	{
    		cout<<"深度(根节点为1):";
    		cout<<treehigh(this->root)<<endl;
    	}
    	int treehigh(BiNode<T> * root)//根节点为第1层
    	{
    		if(root == 0)
    			return 0;
    		int h1 = treehigh(root->left);
    		int h2 = treehigh(root->right);
    		if(h1>h2)//总是返回较大的那个
    			return (h1+1);
    		return h2+1;
    	}

    七,叶子数:

    	void Countleaf()
    	{
    		cout<<"子叶个数";
    		cout<<countleaf(this->root)<<endl;
    	}
    	int countleaf(BiNode<T> * root)
    	{
    		if (root != 0)
    		{
    			if(root->left==0&&root->right==0)//叶子节点时返回1
    			{
    				return 1;
    			}
    			return countleaf(root->left)+countleaf(root->right);//左边的叶子数加右边的叶子数,递归调用
    
    		}
    		return 0;
    	}

    八,根据中序和先序序列还原二叉树:

    BiNode<T>* restoretree(T *pre,T *mid, int n)//根据中序和前序还原二叉树
    {
    	BiNode<T> *p;
    	T *t;
    	int left;
    	if(n<=0)  
    		return(NULL);
    	p = new BiNode<T>;
    //	p = (BiNode<T>*)malloc(sizeof(BiNode<T>));
    	p->data = *pre;
    	for(t=mid;t<mid+n;t++)
    		if(*t==*pre)
    			break;  /*在中序遍历序列中查找根节点*/ 
    	left = t - mid;  /*左子树的节点个数*/ 
    	p->left = restoretree(pre+1,mid,left);//递归调用,生成左孩子
    	p->right = restoretree(pre+1+left,t+1,n-1-left);//生成右孩子
    	return p;
    }
    void Restoretree(T *per,T *in, int n)
    {
    	root=restoretree(per,in,n);
    }

    展开全文
  •  printf("请输入数据 0表示不存在的结点, -1表示输入结束\n ");  while(1)  {  scanf("%d",&x); //进行录入数据  if(x) //当输入-1表示录入结束  {  break;  }  n++; //结点编号  if(x>0) //结点...
  • cout请输入二叉树,空值以#代表,输完要以Ctrl+Z表示结束,否则影响下个树的创建!:"; creat_tree(root); //创建二叉树 //前序遍历二叉树 cout前序遍历序列是:"; pre_order(root); cout; Treep thrt; thrt...
  • 2020-11-28

    2020-11-28 00:27:01
    Delet()函数里面,输入创建二叉树的根节点,利用递归找到待删除子树根结点后,另其等于NULL,相当于切断(值还保存在内存中),然后返回,结束当前层递归。 但是在主函数里面调用后,为什么删除后的二叉树遍历...

    救救孩子吧,为什么删除二叉树子树的函数代码不能实现啊??
    首先创建了这棵二叉树
    在这里插入图片描述
    在这里插入图片描述
    Delet()函数里面,输入为创建二叉树的根节点,利用递归找到待删除子树根结点后,另其等于NULL,相当于切断(值还保存在内存中),然后返回,结束当前层递归。
    在这里插入图片描述
    但是在主函数里面调用后,为什么删除后的二叉树遍历结果跟没删除之前是一样的啊?哪里有问题吗?
    在这里插入图片描述
    要是在主函数里面加一句,b -> left -> left =NULL;手动赋值为NULL,再遍历,能够删除成功。
    在这里插入图片描述
    在这里插入图片描述
    是哪里出了问题?

    展开全文
  • 唯一坑人的地方就是要纠结如何判断输入结束的标志。看了一下别人的代码,无语了。这道题可以用两道题来写。一种是map,一种是创建排序二叉树。 map写法: #include #include #include #include #include using ...
  • /*在DEV C++编译有问题,但在CodeBlocks编译没问题而且能运行,但是运行时又在数据测试在删除结点后程序运行异常结束*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #define M 100+1 // 宏定义...
  • 3.1.0 在函数内定义一个字符数组,用gets函数输入字符串的时候,如果输入越界,为什么程序会崩溃? 3.1.1 C++中引用与指针的区别 3.1.2 C/C++程序的内存分区 3.1.3 快速排序的思想、时间复杂度、实现以及优化方法...
  • 如题,在学习二叉搜索树时想要自己添加一些内容,但是不知道为什么就是会出错,自己感觉好像问题出在创建二叉树的地方,但是不知道怎么改.希望大佬能帮忙看看,如果能配上讲解就更好了,感谢. 下面贴上代码,之后是罗列...
  • 数据结构(C++)有关练习题

    热门讨论 2008-01-02 11:27:18
    2、 请用C++编写一个算法,完成以下功能: a. 从键盘输入一段文字,以$作结束符号; b. 统计文字中的文本行数,字母,数字以及其他符号的数量,并在屏幕上显示; 3、 请用C++编写一个算法,完成矢量的...
  • 12_指针数组自我结束能力(三种表示方法) 13_干活要知道在什么框架之下干活 14_结构体类型和变量定义及基本操作 15_结构体元素做函数参数pk结构指针做函数参数 16_结构体做函数基本操作 17_结构体做函数内存分配指针 ...
  • 步骤2:如果X的值与中间项的值相等,则查找成功,结束查找; 步骤3:如果X小于中间项的值,则在线性表的前半部分以二分法继续查找; 步骤4:如果X大于中间项的值,则在线性表的后半部分以二分法继续查找。 例如,...
  • 11.3.5 二叉树 433 11.4 共享内存 442 11.4.1 联合 442 11.4.2 联合指针 444 11.4.3 联合的初始化 444 11.4.4 联合中的结构成员 444 11.5 定义自己的数据类型 446 11.5.1 结构与类型定义(typedef)功能 446 ...
  • 11.3.5 二叉树 433 11.4 共享内存 442 11.4.1 联合 442 11.4.2 联合指针 444 11.4.3 联合的初始化 444 11.4.4 联合中的结构成员 444 11.5 定义自己的数据类型 446 11.5.1 结构与类型定义(typedef)功能 446 ...
  • 用法:开始印刷->spool 文件名 结束印刷->spool off 列子: 文件内容 9. 显示宽度 (linesize) 说明:设置显示行的宽度,默认是80个字符 用法:set linesize 120 10. 显示页数 (pagesize) 说明:设置每页显示的...
  • [size=15.5556px]A、VC环境下创建项目工程 [size=15.5556px]B、书写代码 [size=15.5556px]C、Debug和Release [size=15.5556px]D、文件包含#include [size=15.5556px]二、C语言概论 [size=15.5556px]1C/C++基本数据...
  • AIC的Java课程7-12章

    2007-07-29 20:55:11
     明白通过捕获异常判定输入文件流的结束。  [*]知道使用RandomAccessFile类和seek方法随机存取文件。 机动时间和复习 2课时 <br> 考试 4课时  时间:120-150分钟;其余时间可用于答疑。...
  • AIC的Java课程1-6章

    2007-07-29 16:20:11
     明白通过捕获异常判定输入文件流的结束。  [*]知道使用RandomAccessFile类和seek方法随机存取文件。 机动时间和复习 2课时 <br> 考试 4课时  时间:120-150...
  • 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3)从堆上分配,亦称动态内存分配。...
  • 但如果并发的数量很多,而且每个线程都是执行很短的时间便结束了,那样频繁的创建线程和销毁进程会大大的降低系统运行的效率。线程池正是为了解决多线程效率低的问题而产生的,他使得线程可以被复用,就是线程执行...

空空如也

空空如也

1 2
收藏数 23
精华内容 9
关键字:

创建二叉树输入什么结束