① 用c語言創建一棵二叉樹並使其顯現出來
#include <stdio.h>//頭文件
#include <stdlib.h>
#include <malloc.h>
typedef struct BiTNode//定義節點
{
char data;//元素類型為字元
struct BiTNode *lchild,*rchild;//左孩子右孩子
}
BiTNode,*BiTree;
BiTree CreateBiTree()//用先序遞歸建樹
{
char p;BiTree T;
scanf("%c",&p);
if(p==' ') T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));//開辟空間
T->data=p;
T->lchild=CreateBiTree(T->lchild);
T->rchild=CreateBiTree(T->rchild);
}
return (T);
}
void PreOrder(BiTree T)先序遍歷
{
if(T!=NULL)
{
printf("%c",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void main()//主函數
{
BiTree Ta;
Ta=CreateBiTree();
printf("樹:");
printf("\n");
PreOrder(Ta);
}
就這個吧,挺簡單的
② 看了半天用c語言實現二叉樹的建立與遍歷,居然沒看懂。
如何建立二叉樹,為了方便理解中遞推法
案例1:
#Include <stdio.h>
#include <stdlib.h>
struct Data{
int num;
struct Data* left; // 左節點指針
struct Data* right; // 右節點指針
};
typedef struct Data Data;
// 創建節點
Data* create_node(int data){
Data *node = (Data*)malloc(sizeof(Data));
node->left = NULL;
node->right = NULL;
node->num = data;
return node;
};
// 給二叉樹有序地插入節點
bool insert_node(Data *root, int data){
while(1){
if(data == root->num){
return false;
}
else if(data > root->num){ // 如果輸入的數值 大於 當前根節點的數值,就插入當前根節點的右邊
if(root->right == NULL){ // 如果當前根的右節點指針為空就插入
root->right = create_node(data);
return true;
}else{ // 如果當前根的右節點指針不為空就繼續遍歷下一個根
root = root->right;
}
}
esle if(data < root->num){
// 如果輸入的數值 小於 當前根節點的數值, 就插入當前根節點的左端
if(root->left == NULL){ //如果當前根的左節點指針為空就插入
root->left = create_node(data);
return true;
}else{ // 如果當前根的左節點不為空,就繼續變數下一個根
root = root->left;
}
}
}
}
int main(){
Data *root = NULL;
while(1){
int num;
printf("請輸入數值:");
scanf("%d",&num);
if(num < 0)break; // 如果輸入的是負數就退出循環
if(root == NULL){
root = create_node(num); // 創建父樹根
}else{
if(!insert_node(root)){ // 向二叉樹添加節點
printf("插入失敗\n");
}
}
}
}
③ 判斷完全二叉樹用C語言編寫
用一個線性表和一個隊列,表存放的是邊集,隊列用於按層次遍歷。程序流程如下
1初始化空表、空隊;
2輸入結點數、指定根結點,輸入邊到表中;
3根結點進隊;
4將隊首出隊到p;
5若表為空,返回1(真)。不空則在表中查找第一項等於p的邊i。若找到,將邊i的第二項進隊,從表中刪除邊i。若沒有找到,則返回0(假)。
6若表為空,返回1(真)。不空則在表中查找第二項等於p的邊i。若找到,將邊i的第一項進隊,從表中刪除邊i。若沒有找到,則返回0(假)。
7跳到4。
補充提供一個相應的程序代碼如下,你可以試試
#include <stdio.h>
#define N 1024
void main( )
{
short list[N][2], queue[N], listLength = 0, front = 0, rear = 0, r, n, i, p;/*1 初始化空表,空隊*/
char flag; /*flag是判斷結果標識*/
scanf("%d%d", &n, &r); /*2 輸入結點數、指定根結點,輸入邊到表中*/
for(i = 0; i < n - 1; i++)
scanf("%d%d", &list[i][0], &list[i][1]);
listLength = n - 1;
queue[rear++] = r;/*3 根結點進隊*/
while(1) {
p = queue[front++];/*4 將隊首出隊到p*/
if(listLength == 0) { /*5 如果表為空,則返回1(真)*/
flag = 1;
break;
}
for(i = 0; i < listLength && list[i][0] != p; i++); /*尋找第一項等於p的邊i*/
if(i == listLength) {/*如果沒有找到,返回0(假)*/
flag = 0;
break;
}
queue[rear++] = list[i][1];/*將邊i的第二項進隊*/
for(; i < listLength - 1; i++)/*刪除邊i*/
list[i][0] = list[i + 1][0], list[i][1] = list[i + 1][1];
listLength--;
if(listLength == 0) { /*6 若表為空,返回1(真)*/
flag = 1;
break;
}
for(i = 0; i < listLength && list[i][1] != p; i++);/*在表中查找第二項等於p的邊i*/
if(i == listLength) { /*如果沒有找到,返回0(假)*/
flag = 0;
break;
}
queue[rear++] = list[i][0]; /*將邊i的第一項進隊*/
for(; i < listLength - 1; i++)/*刪除邊i*/
list[i][0] = list[i + 1][0], list[i][1] = list[i + 1][1];
listLength--;
}/*7 跳到4*/
if(flag)
printf("yes
");
else
printf("no
");
}
運行結果
④ 二叉樹 C語言實現
編譯通過
先序創建並輸出
#include <stdio.h>
#include <stdlib.h>
typedef struct BTree{
char data;
struct BTree *lchild;
struct BTree *rchild;
}BinTree;
BinTree *pre_order()
{
BinTree *p;
char ch;
scanf("%c",&ch);
if(ch==' ')
return NULL;
p=(BinTree *)malloc(sizeof(BinTree));
p->data=ch;
p->lchild=pre_order();
p->rchild=pre_order();
return p;
}
BinTree *in_order()
{
BinTree *p;
char ch;
p->lchild=in_order();
scanf("%c",&ch);
if(ch==' ')
return NULL;
p->rchild=in_order();
}
void post_order(BinTree *p)
{
if(p!=NULL)
{
post_order(p->lchild);
post_order(p->rchild);
printf("%c ",p->data);
}
}
void main()
{
BinTree *tree;
printf("Please Enter the pre_order:\n");
tree=pre_order();
printf("\n");
//printf("Please Enter the in_order:\n");
//tree=in_order();
//printf("\n");
post_order(tree);
printf("\n");
}
先序和中序不能同時使用,要麼就光先序,要麼就再用另一個數做中序
⑤ 二叉樹怎樣用C語言實現
以下代碼可實現二叉樹的遞歸創建與中序遍歷,但在輸入時需在輸入完有效數據後再連續輸入多個負數才可以。
#include <stdio.h>
#include <stdlib.h>
typedef struct BitNode
{
int data;
struct BitNode *lchile,*rchild;
}*BiTree;
BiTree CreateBiTree(BiTree &T)
{
int d;
scanf("%d",&d);
if (d<0)
return NULL;
else
{
if (!(T=(BiTree)malloc(sizeof(BiTree))))
{
exit(1);
}
T->data=d;//先根序創建二叉樹
printf("%d ",T->data);
T->lchile=CreateBiTree(T->lchile);//創建左子樹
T->rchild=CreateBiTree(T->rchild);//創建右子樹
return T;
}
}
void InOrderView(BiTree &T)//中序遍歷二叉樹
{
if(T)
{
InOrderView(T->lchile);
printf("%d ",T->data);
InOrderView(T->rchild);
}
}
void main()
{
BiTree T;
T=CreateBiTree(T);//遞歸創建二叉樹
InOrderView(T);
}
⑥ 數據結構二叉樹的創建(c語言版)
//輸入的格式為:abd##e##c##
#include "stdlib.h"
typedef int Element;
struct Tree
{
Element data;
struct Tree *left;
struct Tree *right;
};
void CreateBinSortTree(struct Tree **t);
void InsertNode2Tree(struct Tree **root, Element num);
void PrintTree(struct Tree *r, int order);
int main(int argc, char* argv[])
{
printf("請輸入一組字母(#表示子樹為空)\n");
struct Tree *t=NULL;
CreateBinSortTree(&t);
printf("\n根左右:");
PrintTree(t,1);
printf("\n左根右:");
PrintTree(t,2);
printf("\n左右根:");
PrintTree(t,3);
printf("\n");
return 0;
}
void CreateBinSortTree(struct Tree **t)
{
char ch;
ch = getchar();
if (ch == '#')
{
*t = NULL;
return ;
}
*t = (struct Tree *)malloc(sizeof(struct Tree));
(*t)->data = ch;
CreateBinSortTree( &((*t)->left));
CreateBinSortTree( &((*t)->right));
}
void PrintTree(struct Tree *r, int order)
{
if (r == NULL)
{
return ;
}
switch(order)
{
case 1:
printf("%c ",r->data);
PrintTree(r->left,order);
PrintTree(r->right,order);
break;
case 2:
PrintTree(r->left,order);
printf("%c ",r->data);
PrintTree(r->right,order);
break;
case 3:
PrintTree(r->left,order);
PrintTree(r->right,order);
printf("%c ",r->data);
break;
}
}
⑦ 數據結構,完全二叉樹問題(用C語言)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node
{
int elem;
struct node *lch,*rch;
}Bnode;
Bnode *creat()
{
Bnode *root =NULL;
Bnode *s[20];
int i,x;
int j;
printf("input i and x:");
scanf("%d,%d",&i,&x);
while(i != 0)
{
Bnode *p = (Bnode *)malloc(sizeof(Bnode));
p->elem = x;
p->lch = NULL;
p->rch = NULL;
s[i] = p;
if(i == 1)root=p;
else
{
j = i/2;
if(i%2 == 0) //編號為偶數
s[j]->lch = p;
else
s[j]->rch = p;
}
printf("input i and x:");
scanf("%d,%d",&i,&x);
}
return root;
}
void anceng(Bnode *p) //按層遍歷
{
Bnode *q = p;
Bnode *s[20];
int front = 0;
int rear = 0;
if(q != NULL)
{
rear++;
s[rear] = q;
}
while(rear != front)
{
front++;
p = s[front];
printf("%d\n",p->elem);
if(p->lch != NULL)
{
rear++;
s[rear] = p->lch;
}
if(p->rch != NULL)
{
rear++;
s[rear] = p->rch;
}
}
}
void zhonggen(Bnode *p) //非遞歸中根遍歷
{
Bnode *q = p;
Bnode *s[20];
int top = 0;
int flag = 1;
do
{
while(q != NULL)
{
top++;
s[top] = q;
q = q->lch;
}
if(top == 0)flag = 0;
else
{
q = s[top];
top--;
printf("%d\n",q->elem);
q = q->rch;
}
}
while(flag);
}
void postorder(Bnode *p) //遞歸後根遍歷
{
if(p!= NULL)
{
postorder(p->lch);
postorder(p->rch);
printf("%d\n",p->elem);
}
}
void inorder(Bnode *p) //遞歸中根遍歷
{
if(p!= NULL)
{
inorder(p->lch);
printf("%d\n",p->elem);
inorder(p->rch);
}
}
void preorder(Bnode *p) //遞歸先根遍歷
{
if(p!= NULL)
{
printf("%d\n",p->elem);
preorder(p->lch);
preorder(p->rch);
}
}
int main(void)
{
int tmp;
int i = 0;
int choice;
Bnode *root;
do
{
printf("\n");
printf("1.creat\n");
printf("2.先序遍歷\n");
printf("3.中序遍歷\n");
printf("4.後序遍歷\n");
printf("5.中根遍歷\n");
printf("6.按層遍歷\n");
printf("0.exit\n");
printf("input your choice:");
scanf("%d",&choice);
switch(choice)
{
case 1:
root = creat();
break;
case 2:
preorder(root);
break;
case 3:
inorder(root);
break;
case 4:
postorder(root);
break;
case 5:
zhonggen(root);
break;
case 6:
anceng(root);
break;
case 0:
break;
}
}while(choice);
return 0;
}
此代碼有創建和遍歷的各種演算法,遍歷有按層遍歷,各種遞歸遍歷和非遞歸遍歷。希望對樓主有幫助。
望採納!!
⑧ 二叉樹c語言實現
#include<iostream.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char data;
struct node *lchild,*rchild;//
}BiTNode,*BiTree;
void CreatBiTree(BiTree &T)
{
char ch;
ch=getchar();
if (ch == ' ')
T = 0;
else {
T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=ch;//生成根節點
CreatBiTree(T->lchild);//構造左子樹
CreatBiTree(T->rchild);//構造右子樹
}
}
void preorder(BiTree T)//前序遍歷
{
if (T!=NULL){
printf ("%c",T->data);
preorder(T->lchild);
preorder(T->rchild);
}
}
void inorder(BiTree T)//中序遍歷
{
if (T!=NULL){
inorder(T->lchild);
printf ("%c",T->data);
inorder(T->rchild);
}
}
void postorder(BiTree T)//後序遍歷
{
if (T!=NULL){
postorder(T->lchild);
postorder(T->rchild);
printf ("%c",T->data);
}
}
void main ()
{
cout<<"請輸入要創建的二叉樹包括空格:"<<endl ;
BiTree T;
CreatBiTree(T);//創建二叉樹
cout<<"前序遍歷的結果為:"<<endl;
preorder(T);
cout<<endl;
cout<<"中序遍歷的結果為:"<<endl;
inorder(T);
cout<<endl;
cout<<"後序遍歷的結果為:"<<endl;
postorder(T);
}
⑨ 請問C語言如何創建二叉樹
創建二叉樹的源程序如下:
#include <cstdlib>
#include <stdio.h>
typedef struct node
{ //樹的結點
int data;
struct node* left;
struct node* right;
} Node;
typedef struct
{ //樹根
Node* root;
} Tree;
void insert(Tree* tree, int value)//創建樹
{
Node* node=(Node*)malloc(sizeof(Node));//創建一個節點
node->data = value;
node->left = NULL;
node->right = NULL;
if (tree->root == NULL)//判斷樹是不是空樹
{
tree->root = node;
}
else
{//不是空樹
Node* temp = tree->root;//從樹根開始
while (temp != NULL)
{
if (value < temp->data)//小於就進左兒子
{
if (temp->left == NULL)
{
temp->left = node;
return;
}
else
{//繼續判斷
temp = temp->left;
}
}
else {//否則進右兒子
if (temp->right == NULL)
{
temp->right = node;
return;
}
else {//繼續判斷
temp = temp->right;
}
}
}
}
return;
}
void inorder(Node* node)//樹的中序遍歷
{
if (node != NULL)
{
inorder(node->left);
printf("%d ",node->data);
inorder(node->right);
}
}
int main()
{
Tree tree;
tree.root = NULL;//創建一個空樹
int n;
scanf("%d",&n);
for (int i = 0; i < n; i++)//輸入n個數並創建這個樹
{
int temp;
scanf("%d",&temp);
insert(&tree, temp);
}
inorder(tree.root);//中序遍歷
getchar();
getchar();
return 0;
}
(9)完全二叉樹創建c語言實現擴展閱讀:
簡單二叉樹定義範例:此樹的順序結構為:ABCDE
#include <cstdlib>
#include <stdio.h>
#include <string>
int main()
{
node* p = newnode;
node* p = head;
head = p;
string str;
cin >> str;
creat(p, str, 0)//默認根結點在str下標0的位置
return 0;
}
//p為樹的根結點(已開辟動態內存),str為二叉樹的順序存儲數組ABCD##E或其他順序存儲數組,r當前結點所在順序存儲數組位置
void creat(node* p, string str, int r)
{
p->data = str[r];
if (str[r * 2 + 1] == '#' || r * 2 + 1 > str.size() - 1)p->lch = NULL;
else
{
p->lch = newnode;
creat(p->lch, str, r * 2 + 1);
}
if (str[r * 2 + 2] == '#' || r * 2 + 2 > str.size() - 1)p->rch = NULL;
else
{
p->rch = newnode;
creat(p->rch, str, r * 2 + 2);
}
}
⑩ C語言二叉樹的建立完整程序謝謝!!!
完整程序自己寫吧,我提供個思路:
二叉樹的節點包含三個指針:左指針,右指針,字元串鏈表的頭指針;
構造一個通過兩個字元串的頭指針比較字元竄大小的函數;(先比較串長,再從頭對位開始比較);
構造一個插入函數(遞歸)
最後查找函數(遞歸)返回查找元素距根的距離;