當前位置:首頁 » 編程語言 » c語言四叉樹
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言四叉樹

發布時間: 2022-02-08 18:15:28

A. 關於c語言二叉樹

完全二叉樹除了第一層和最後一層外,其餘各層的結點數都是2的冪,所以都是偶數,因此,當最後一層的結點數為偶數時,樹的總結點數才可能是奇數.
而完全二叉樹只有最後一層的結點數為奇數時,樹中才可能存在唯一的度為1的結點,即最後一個結點的父結點.但現在最後一層結點數為偶數,所以樹中不存在度為1的結點,即n1=0.
所以n=n0+n2=2n0-1=699,n0=350

B. 關於C語言二叉樹

首先二叉樹的結點是由做孩子指針*lchild 右孩子指針*rchild 以及數據成員data

L表示左孩子R表示右孩子T表示他們的父結點

後序遍歷的訪問順序是LRT
中序遍歷的訪問順序是LTR
前序遍歷的訪問順序是TLR

其中說的前中後就是指訪問父結點的次序;

拓撲圖在這里沒法給出啊。。。

--------------------------------------------

這是我用C++類寫的二叉樹的頭文件,裡面有幾個函數你可能用不到,你主要看看那幾個遍歷函數

#include<iostream>

using namespace std;

typedef char elemType;

struct bnode
{
bnode *lchild,*rchild;
elemType data;
};

class BinaryTree
{
public:
BinaryTree();
void create(bnode* &tempR);
void visite(bnode *T);
void preorder(bnode *T);
void inorder(bnode *T);
void postorder(bnode *T);
int high(bnode *T);
void convert(bnode* &tempR,string &a,int i);
void (bnode *T,bnode *&T1);
void level(bnode *T,int i);
void swap(bnode *T);
bnode *root;
private:
int count;
};

BinaryTree::BinaryTree()
{
root = NULL;
count = 0;
}

void BinaryTree::create(bnode* &tempR)
{
elemType x;
cin>>x;
if(x == '.')
{
tempR = NULL;
}
else
{
tempR = new bnode;
count++;
tempR->data = x;
create(tempR->lchild);
create(tempR->rchild);
}
}

void BinaryTree::visite(bnode *T)
{
if(T!=NULL)
cout<<T->data<<' ';
}

void BinaryTree::preorder(bnode *T)
{
if(T!=NULL)
{
visite(T);
preorder(T->lchild);
preorder(T->rchild);
}
}

void BinaryTree::inorder(bnode *T)
{
if(T!=NULL)
{
inorder(T->lchild);
visite(T);
inorder(T->rchild);
}
}

void BinaryTree::postorder(bnode *T)
{
if(T!=NULL)
{
postorder(T->lchild);
postorder(T->rchild);
visite(T);
}
}

int BinaryTree::high(bnode *T)
{
if(T==NULL)
return 0;
else if(high(T->lchild)>high(T->rchild))
return high(T->lchild)+1;
else
return high(T->rchild)+1;
}

void BinaryTree::level(bnode *T,int i)
{
if(T!=NULL)
{
level(T->lchild,i+1);
visite(T);
cout<<i<<' ';
level(T->rchild,i+1);
}
}

void BinaryTree::convert(bnode *&T,string &a,int i)
{
elemType x;
if(i<=a.length())
{
x = a[i-1];
T = new bnode;
count++;
T->data = x;
convert(T->lchild,a,2*i);
convert(T->rchild,a,2*i+1);
}
else
{
T=NULL;
}
}

void BinaryTree::(bnode *T,bnode *&T1)
{
elemType x;
if(T!=NULL)
{
x=T->data;
if(x == '.')
{
T1 = NULL;
}
else
{
T1 = new bnode;
T1->data = x;
T1->lchild = NULL;
T1->rchild = NULL;
(T->lchild,T1->lchild);
(T->rchild,T1->rchild);
}

}
}

void BinaryTree::swap(bnode *T)
{
if(T!=NULL)
{
bnode *temp;
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
swap(T->lchild);
swap(T->rchild);
}
}

C. 在線等~C語言,二叉樹2

先根據先序和中序創建二叉樹,然後層次遍歷輸出,網路了一下,相關代碼做一個鏈接吧,具體還是要自己寫的。

根據先序和中序創建二叉樹代碼參考:

http://blog.csdn.net/hinyunsin/article/details/6315502

層次遍歷

http://www.sharejs.com/codes/cpp/5558

voidLevelOrder(BTNode*b)
{
BTNode*p;
BTNode*qu[MaxSize];
intfront,rear;
front=rear=-1;
rear++;
qu[rear]=b;
while(front!=rear)
{
front=(front+1)%MaxSize;
p=qu[front];
printf("%c",p->data);
if(p->lchild!=NULL)
{
rear=(rear+1)%MaxSize;
qu[rear]=p->lchild;
}
if(p->rchild!=NULL)
{
rear=(rear+1)%MaxSize;
qu[rear]=p->rchild;
}
}
}

D. 請問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;

}


(4)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);

}

}

E. 中序表達式構建二叉樹(C語言)

void Inorder (Tree *p)
{
if (p)
{
Inorder(p->Lchild); //遍歷左子樹
printf(「%d」,p->data); //訪問根結點
Inorder(p->Rchild); //遍歷右子樹
}
}

F. c語言 c語言 二叉樹構造問題

#include<locale.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedefstructBiTNode{//二叉樹結點
chardata; //數據
structBiTNode*lchild,*rchild; //左右孩子指針
}BiTNode,*BiTree;
intnn=0;
intCreateBiTree(BiTree*T){//按先序序列創建二叉樹
chardata;
scanf("%c",&data);//按先序次序輸入二叉樹中結點的值(一個字元),『#』表示空樹
if(data== '#'){
*T=NULL;
}else{
*T=(BiTree)malloc(sizeof(BiTNode));nn++;
(*T)->data=data; //生成根結點
CreateBiTree(&(*T)->lchild);//構造左子樹
CreateBiTree(&(*T)->rchild);//構造右子樹
}
return0;
}
voidVisit(BiTreeT){//輸出
if(T->data !='#'){
printf("%c",T->data);
}
}
voidPreOrder(BiTreeT){//先序遍歷
if(T!=NULL){
Visit(T); //訪問根節點
PreOrder(T->lchild); //訪問左子結點
PreOrder(T->rchild); //訪問右子結點
}
}
voidInOrder(BiTreeT){//中序遍歷
if(T!=NULL){
InOrder(T->lchild); //訪問左子結點
Visit(T); //訪問根節點
InOrder(T->rchild); //訪問右子結點
}
}
voidPostOrder(BiTreeT){//後序遍歷
if(T!=NULL){
PostOrder(T->lchild); //訪問左子結點
PostOrder(T->rchild); //訪問右子結點
Visit(T); //訪問根節點
}
}
voidPreOrder2(BiTreeT){//先序遍歷(非遞歸)
//訪問T->data後,將T入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為T,出棧,再先序遍歷T的右子樹。
BiTree*stack=(BiTree*)malloc(nn*sizeof(BiTree));
int sp=0;
BiTreep=T;//p是遍歷指針
while(p|| sp) { //棧不空或者p不空時循環
if(p!=NULL){
stack[sp]=p;sp++; //存入棧中
printf("%c",p->data);//訪問根節點
p= p->lchild; //遍歷左子樹
}else{
sp--;p=stack[sp]; //退棧
p= p->rchild; //訪問右子樹
}
}
free(stack);
}
voidInOrder2(BiTreeT) {//中序遍歷(非遞歸)
//T是要遍歷樹的根指針,中序遍歷要求在遍歷完左子樹後,訪問根,再遍歷右子樹。
//先將T入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為T,出棧,訪問T->data,再中序遍歷T的右子樹。
BiTree*stack=(BiTree*)malloc(nn*sizeof(BiTree));
int sp=0;
BiTreep=T;//p是遍歷指針
while(p|| sp) { //棧不空或者p不空時循環
if(p!=NULL){
stack[sp]=p;sp++; //存入棧中
p= p->lchild; //遍歷左子樹
}else{
sp--;p=stack[sp]; //退棧
printf("%c",p->data);
p= p->rchild; //訪問右子樹
}
}
free(stack);
}

typedef structBiTNodePost{
BiTreebiTree;
chartag;
}BiTNodePost,*BiTreePost;
voidPostOrder2(BiTreeT){//後序遍歷(非遞歸)
BiTreePost*stack=(BiTreePost*)malloc(nn*sizeof(BiTreePost));
int sp=0;
BiTreep=T;//p是遍歷指針
BiTreePostBT;
while(p!= NULL|| sp) {//棧不空或者p不空時循環
while(p!= NULL){//遍歷左子樹
BT=(BiTreePost)malloc(sizeof(BiTNodePost));
BT->biTree=p;
BT->tag ='L';//訪問過左子樹
stack[sp]=BT;sp++; //存入棧中
p= p->lchild;
}
while(sp&&(stack[sp-1])->tag =='R'){//左右子樹訪問完畢訪問根節點
sp--;BT=stack[sp]; //退棧
printf("%c",BT->biTree->data);
free(BT);
}
if(sp) {//遍歷右子樹
BT=stack[sp-1];
BT->tag ='R';//訪問過右子樹
p= BT->biTree;
p= p->rchild;
}
}
free(stack);
}
voidLevelOrder(BiTreeT){//層次遍歷
BiTreep;
BiTree*queue;
int h=0,t=0,n=0;

if(T==NULL)return;
p=T;
queue=(BiTree*)malloc(nn*sizeof(BiTree));
queue[t]=p;t=(t+1)%10;n++;//根節點入隊
while(n){ //隊列不空循環
p=queue[h]; //對頭元素出隊
printf("%c",p->data);//訪問p指向的結點
h=(h+1)%10;n--; //退出隊列
if(p->lchild!=NULL){//左子樹不空,將左子樹入隊
queue[t]=p->lchild;t=(t+1)%10;n++;
}
if(p->rchild!=NULL){//右子樹不空,將右子樹入隊
queue[t]=p->rchild;t=(t+1)%10;n++;
}
}
free(queue);
}
int main(){
BiTreeT;

setlocale(LC_ALL,"chs");
CreateBiTree(&T);

printf("先序遍歷:");PreOrder(T);printf(" ");
printf("先序遍歷(非遞歸):");PreOrder2(T);printf(" ");
printf(" ");
printf("中序遍歷:");InOrder(T);printf(" ");
printf("中序遍歷(非遞歸):");InOrder2(T);printf(" ");
printf(" ");
printf("後序遍歷:");PostOrder(T);printf(" ");
printf("後序遍歷(非遞歸):");PostOrder2(T);printf(" ");
printf(" ");
printf("層次遍歷:");LevelOrder(T);printf(" ");

return0;
}
//ABC##DE#G##F###
//先序遍歷 :AB CD EG F
//先序遍歷(非遞歸):AB CD EG F
//
//中序遍歷 :CB EG DF A
//中序遍歷(非遞歸):CB EG DF A
//
//後序遍歷 :CG EF DB A
//後序遍歷(非遞歸):CG EF DB A
//
//層次遍歷 :AB CD EF G
//

/// A
/// /
/// B
/// /
/// C D
/// /
/// E F
///
/// G

G. c語言 二叉樹

void previsit(BiTree &T)
{
if(T!=NULL){
printf("%d\n",T->data);
previsit(T->lchild);
previsit(T->rchild);
}
}

前序遍歷少了判斷是否為NULL的判斷

H. c語言繪制二叉樹

你那裡是列印出的啥?不會是沒有存下數據列印了亂碼吧?:)

[修改]
比如,我把和你的二叉樹相關的代碼去掉,改了一下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <graphics.h>

int main()
{
char str[10];
int x = 100, y = 100;
int e = 9;

/* select a driver and mode that supports */
/* multiple drawing colors. */
int gdriver = DETECT, gmode = VGA, errorcode;

detectgraph(&gdriver, &gmode);
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "d:\\bc\\bgi");

/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* terminate with an error code */
}

setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(x,y,9,9);
setcolor(WHITE);
circle(x,y,10);

sprintf(str,"%d",e);
outtextxy(x-3,y-2,str);

/* clean up */
getch();
/* colse */
closegraph();

return 0;
}
就能在圈圈裡列印出"9"

I. C語言,二叉樹

void insert(node ** tree, int val) {
node * temp = NULL; if(!(*tree)) {
temp = (node *)malloc(sizeof(node));
temp->left = temp->right = NULL;
temp->data = val; *tree = temp; return ;
}
if (val < (*tree)->data) {
insert(&(*tree)->left,val);
}else if (val > (*tree)->data) {
insert(&(*tree)->right,val);
}
}

J. c語言:二叉樹

system("cls");//清屏
printf("input tree node elem(elem-->left-->right):\n");//屏幕上輸出--請輸入樹節點元素,(元素-->左--》右) 如何輸入,要看Pre_Create_BT函數