正文
c语言树的创建函数 c语言树的定义
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
数据结构c语言习题。编写一个函数以二叉查找树T和两个有序的关键字 k1,
// 创建二叉树的原数组数据: 40 20 60 10 30 50 70
// 前序遍历序列: 40 20 10 30 60 50 70
// 中序遍历序列: 10 20 30 40 50 60 70
// 后序遍历序列: 10 30 20 50 70 60 40
// 输入关键字k1,k2的数值: 30 50
// 打印的结果:
// 40 30 50
//
// 二叉树示意图:
//
// 40
// / \
// 20 60
// / \ / \
// 10 30 50 70
#include "stdio.h"
#include "stdlib.h"
struct Tree
{
int data;
struct Tree *left;
struct Tree *right;
};
typedef struct Tree TreeNode;
typedef TreeNode *Bitree;
Bitree insertNode(Bitree root,int data) //插入结点
{
Bitree newnode;
Bitree current;
Bitree back;
newnode=(Bitree)malloc(sizeof(TreeNode));
if(newnode==NULL)
{
printf("\n动态分配内存出错.\n");
exit(1);
}
newnode-data=data;
newnode-left=NULL;
newnode-right=NULL;
if(root==NULL)
{
return newnode;
}
else
{
current=root;
while(current!=NULL)
{
back=current;
if(current-data data)
current=current-left;
else
current=current-right;
}
if(back-data data)
back-left=newnode;
else
back-right=newnode;
}
return root;
}
Bitree createTree(int *data,int len) //创建二叉树(非递归)
{
Bitree root=NULL;
int i;
for(i=0;ilen;i++)
{
root=insertNode(root,data[i]);
}
return root;
}
void preOrder(Bitree ptr) //先序遍历(递归法)
{
if(ptr!=NULL)
{
printf("%d ",ptr-data);
preOrder(ptr-left);
preOrder(ptr-right);
}
}
void inOrder(Bitree ptr) //中序遍历(递归法)
{
if(ptr!=NULL)
{
inOrder(ptr-left);
printf("%d ",ptr-data);
inOrder(ptr-right);
}
}
void postOrder(Bitree ptr) //后序遍历(递归法)
{
if(ptr!=NULL)
{
postOrder(ptr-left);
postOrder(ptr-right);
printf("%d ",ptr-data);
}
}
//根据关键字k1和k2,进行区间查找(递归法)
void btreeSearch(Bitree ptr,int k1,int k2)
{
if(ptr!=NULL)
{
if(ptr-data k1 ptr-data k2)
{
btreeSearch(ptr-right,k1,k2);
}
else if(ptr-data == k1 ptr-data k2)
{
printf("%d ",ptr-data);
btreeSearch(ptr-right,k1,k2);
}
else if(ptr-data k1 ptr-data k2)
{
printf("%d ",ptr-data);
btreeSearch(ptr-left,k1,ptr-data);
btreeSearch(ptr-right,ptr-data,k2);
}
else if(ptr-data k1 ptr-data == k2)
{
printf("%d ",ptr-data);
btreeSearch(ptr-left,k1,k2);
}
else if(ptr-data k1 ptr-data k2)
{
btreeSearch(ptr-left,k1,k2);
}
else if(ptr-data == k1 ptr-data == k2)
{
printf("%d ",ptr-data);
}
else
{
printf("其它情况,当前节点的数值是%d",ptr-data);
}
}
}
int main()
{
Bitree T=NULL; //T是二叉查找树
int data[]={40,20,60,10,30,50,70};
int len;
int i;
int k1,k2; //关键字k1,k2
int tmp;
len=sizeof(data)/sizeof(int);
printf("创建二叉树的原数组数据: ");
for(i=0;ilen;i++)
{
printf("%d ",data[i]);
}
T=createTree(data,len); //创建二叉树
printf("\n前序遍历序列: ");
preOrder(T);
printf("\n中序遍历序列: ");
inOrder(T);
printf("\n后序遍历序列: ");
postOrder(T);
printf("\n输入关键字k1,k2的数值: ");
scanf("%d%d",k1,k2);
if(k1k2)
{
tmp=k1;
k1=k2;
k2=tmp;
}
//根据关键字k1和k2,进行区间查找(递归法)
btreeSearch(T,k1,k2);
printf("\n");
return 0;
}
用C语言编程实现二叉树的基本操作,并完成下述函数功能: (1) CreateBiTree( ):根据先序遍历序列生成一棵
下面有一个建树c语言树的创建函数的例子。
class TreeNode{
public:
TreeNode *left;
TreeNode *right;
int value;
TreeNode(int v): value(v)
{
left = NULL;
right = NULL;
}
~TreeNode() {
if (left != NULL) delete left;
if (right != NULL) delete right;
}
};
void addToTree(TreeNode *curr, TreeNode *p) {
if(p-value = curr-value) {
if(curr-left == NULL) {
curr-left = p;
return;
}
else addToTree(curr-left, p);
} else {
if(curr-right == NULL) {
curr-right = p;
return;
}
else addToTree(curr-right, p);
}
}
void printTree(TreeNode *p) {
if(p==NULL) return;
printTree(p-left);
printf("%d ", p-value);
printTree(p-right);
}
TreeNode * createBiTree(int[] a, int len)
{
TreeNode *root = new TreeNode(a[0]);
for(int i=1; i5; i++) {
TreeNode *p = new TreeNode(a[i]);
addToTree(root, p);
}
return root;
}
void main() {
int a[] = {3, 4, 1, 2, 5};
CreateBiTeee(a, 5);
printTree(root);
delete root;
}
二叉树建立中函数定义与运行(C语言)
大多数问题是函数名字写错 了。
#includestdio.h
#includestdlib.h
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef char TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
Status CreateBitree(BiTree T);
Status PreOrder(BiTree T);
Status InOrder(BiTree T);
Status CreateBitree(BiTree T)
{
char ch;
scanf("%c",ch);
if(ch=='#')
T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T);
exit(OVERFLOW);
T-data=ch;
CreateBitree(T-lchild);
CreateBitree(T-rchild);
}
return OK;
}
Status PreOrder(BiTree T)
{
if(T){
printf("%c",T-data);
PreOrder(T-lchild);
PreOrder(T-rchild);
}
return OK;
}
Status InOrder(BiTree T)
{
if(T){
InOrder(T-lchild);
printf("%c",T-data);
InOrder(T-rchild);
}
return OK;
}
Status PostOder(BiTree T)
{
if(T){
PostOder(T-lchild);
PostOder(T-rchild);
printf("%c",T-data);
}
return OK;
}
int main()
{
BiTree T={'\0'};
printf("先序建树:依次输入二叉树结点号,孩子为空时输入空格\n");
CreateBitree(T);
printf("\n先序遍历二叉树为:");
PreOrder(T);
printf("\n中序遍历二叉树为:");
InOrder(T);
printf("\n后序遍历二叉树为:");
PostOder(T);
return 0;
}
c语言数据结构 递归创建二叉树的函数如何输入退出?这个函数一直让输入 无论输入什么 都无法结束输入
递归创建二叉树的输入是有讲究的,可参考:网页链接中最后的输入示例:如果你用#作为结束,则对应输入:1 2 4 # 6 ###3 #5 #7 #8 ##
再给个递归创建二叉树的例子:
#include stdio.h
#include stdlib.h
typedef struct Tree {
int Val;
struct Tree* left;
struct Tree* right;
}Tree;
Tree * CreateBiTree(void)
{
Tree * T;
int val;
scanf("%d", val);
if(val == 0)
T = NULL;
else
{
T = (Tree *)malloc(sizeof(Tree));
T - Val = val;
T - left = CreateBiTree();
T - right = CreateBiTree();
}
return T;
}
void Print(Tree* root)
{
if (root != NULL)
{
Print(root-left);
printf("%d ", root-Val);
Print(root-right);
}
}
int main()
{
Tree* root = CreateBiTree();
Print(root);
return 0;
}
以上面的输入例子1 2 4 # 6 ###3 #5 #7 #8 ##为例,对应的输入为:1 2 3 0 6 0 0 0 3 0 5 0 7 0 8 0 0
运行结果:
当然也可以这样:
#include stdio.h
#include stdlib.h
typedef struct Tree {
int Val;
struct Tree* left;
struct Tree* right;
}Tree;
void CreateBiTree(Tree**T)
{
int val;
scanf("%d", val);
if(val == 0)
*T = NULL;
else
{
*T = (Tree *)malloc(sizeof(Tree));
(*T)-Val = val;
CreateBiTree((*T)-left);
CreateBiTree((*T)-right);
}
}
void Print(Tree* root)
{
if (root != NULL)
{
Print(root-left);
printf("%d ", root-Val);
Print(root-right);
}
}
int main()
{
Tree* root;
CreateBiTree(root);
Print(root);
return 0;
}
这里的输入示例为:1 2 4 0 6 0 0 0 7 0 0 0
运行结果:
C++ 版:
#include iostream
using namespace std;
typedef struct Tree {
int Val;
struct Tree* left;
struct Tree* right;
}Tree;
void CreateBiTree(Tree* T)
{
int val;
cin val;
if(val == 0)
T = NULL;
else
{
T = new Tree;
T-Val = val;
CreateBiTree(T-left);
CreateBiTree(T-right);
}
}
void Print(Tree*root)
{
if (root != NULL)
{
Print(root-left);
cout root-Val ' ';
Print(root-right);
}
}
int main()
{
Tree* root;
CreateBiTree(root);
Print(root);
return 0;
}
看了一下你的递归部分的代码,是正确的,没问题。
C语言建立二叉树为什么那个建立函数要返回指针,为什么直接传指针不行啊?
T-lchrild = chushihua(T-lchrild);
T-rchrild = chushihua(T-rchrild);
如果不返回指针,这两句就不能执行了
这是递归执行的,最开始的chushihua函数建立叶结点,然后返回到 父节点,执行
T-lchrild = chushihua(T-lchrild);
T-rchrild = chushihua(T-rchrild);
让父节点的左右孩子节点等于叶结点,再返回祖父节点执行函数,一直返回到根结点
c语言树的创建函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言树的定义、c语言树的创建函数的信息别忘了在本站进行查找喔。