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

樹的前序遍歷和插入c語言

發布時間: 2022-07-12 06:28:52

1. 求c語言數據結構二叉樹的建樹,前序遍歷,輸出樹的代碼,能用採納。

#include
#include
#define MAXSIZE 100 //二叉樹中最多的結點數
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;

struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//定義函數指針
typedef void(* Visit)(BiTree);
//二叉樹的初始化
void Init_BiTree(BiTree *T)
{
*T = NULL;
}
//判斷二叉樹是否為空,返回1
int IsEmpty_BiTree(BiTree *T)
{

return *T == NULL;
}
//創建二叉樹
void Create_BiTree(BiTree *T)
{
char ch;
ch = getchar();
//當輸入的是"#"時,認為該子樹為空

if(ch == '#')

*T = NULL;
//創建樹結點
else{

*T = (BiTree)malloc(sizeof(BiTNode));

(*T)->data = ch; //生成樹結點
//生成左子樹
Create_BiTree(&(*T)->lchild);

//生成右子樹
Create_BiTree(&(*T)->rchild);

}
}
//輸出結點的值
void Print_BiTreeNode(BiTree T)
{
printf("%c\t",T->data);

}
//先序遍歷二叉樹
void PreOrder_BiTree(BiTree T,Visit visit)
{
if(!IsEmpty_BiTree(&T))
{
visit(T);

PreOrder_BiTree(T->lchild,visit);
PreOrder_BiTree(T->rchild,visit);

}
}
int main(){
BiTree T;
//將二叉樹初始為一個空的二叉樹
Init_BiTree(&T);
//創建二叉樹
Create_BiTree(&T);
//先序遍歷
printf("\n先序遍歷結果:");
PreOrder_BiTree(T,Print_BiTreeNode);
return 0;
}

2. 二叉樹的先序遍歷演算法------將其用c語言編寫程序

void preorder(BiTree T)
{
if(p!=NULL)
{
printf("%c",T->data);
preorder(T->lchild);
preorder(T->rchild);

}
}

3. 數據結構用c語言寫:創建樹,並進行先序,中序,後序遍歷!

#include <iostream>
using namespace std;

class Node
{
public:
Node(){ this->pLchild = this->pRchild = NULL; }
char data;
Node * pLchild;
Node * pRchild;
};
Node * CreateTree()
{
Node * root = new Node;
root->data = 'A';
Node * pB = new Node;
pB->data = 'B';
Node * pC = new Node;
pC->data = 'C';
Node * pD = new Node;
pD->data = 'D';
Node * pE = new Node;
pE->data = 'E';

root->pLchild = pB;
root->pRchild = pC;
pC->pLchild = pD;
pD->pRchild = pE;

return root;
}
void InTraverseTree(Node * pT) //中序遍歷
{
if (NULL == pT)
return;
else
{
InTraverseTree(pT->pLchild);
cout << pT->data;
InTraverseTree(pT->pRchild);

}
}
void PostTraverseTree(Node * pT) //後序遍歷
{
if (NULL == pT)
return;
else
{
PostTraverseTree(pT->pLchild);

PostTraverseTree(pT->pRchild);
cout << pT->data;
}
}
void PreTraverseTree(Node * pT) //先序遍歷
{
if (NULL==pT)
{
return;
}
else
{
cout << pT->data;
PreTraverseTree(pT->pLchild);
PreTraverseTree(pT->pRchild);
}
}
void destroyTree(Node * PT) //銷毀二叉樹
{
if (NULL == PT)
return;
else
{
destroyTree(PT->pLchild);
destroyTree(PT->pRchild);
delete PT;
}

}
int main()
{
Node * pT = CreateTree();
cout << "先序遍歷";

PreTraverseTree(pT);

destroyTree(pT);
/*cout << "\n中序遍歷" ;
InTraverseTree(pT);
cout << "\n後序遍歷";
PostTraverseTree(pT);*/
// PreTraverseTree(pT);
//cout << endl;
system("pause");
return 0;
}
用C++寫的 不過跟C沒什麼區別

4. c語言實現二叉樹的先序,中序,後序的遞歸和非遞歸演算法和層次遍歷演算法

#include<malloc.h> // malloc()等
#include<stdio.h> // 標准輸入輸出頭文件,包括EOF(=^Z或F6),NULL等
#include<stdlib.h> // atoi(),exit()
#include<math.h> // 數學函數頭文件,包括floor(),ceil(),abs()等

#define ClearBiTree DestroyBiTree // 清空二叉樹和銷毀二叉樹的操作一樣

typedef struct BiTNode
{
int data; // 結點的值
BiTNode *lchild,*rchild; // 左右孩子指針
}BiTNode,*BiTree;

int 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表示空(子)樹。修改
int number;
scanf("%d",&number); // 輸入結點的值
if(number==Nil) // 結點的值為空
T=NULL;
else // 結點的值不為空
{ T=(BiTree)malloc(sizeof(BiTNode)); // 生成根結點
if(!T)
exit(OVERFLOW);
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
}

5. C語言實現左孩子右兄弟樹的建立,插入,層次遍歷,可以加分

問的有些問題,程序建立的2叉樹只能是完全2叉樹,其他的樹只能手動建立,我這里給你完全2叉樹的建立和遍歷,完全2叉樹是沒有插入的,給你函數
#include
#include
typedef
struct
_node_
{
int
data;
struct
_node_
*lchild,*rchild;
}bitree;
//遞歸建立完全2x樹,root每次遍歷後都會返回上層樹的根節點,這點容易理解錯,最終返回的root是整個2x樹的根節點,傳參int
i
是給2x樹賦值:1,2,3,4,5……,int
n是想建立的總共節點數。
bitree
*CreatBitree(int
i,int
n)
{
bitree
*root
=
(bitree*)malloc(sizeof(bitree));
root->data
=
i;
if(i
*
2
<=
n)
root->lchild
=
CreatBitree(2
*
i,n);
else
root->lchild
=
NULL;
if(i
*
2
+
1
<=n)
root
->rchild
=
CreatBitree
(2
*
i
+1,n);
else
root->rchild
=
NULL;
return
root;
}
//遍歷
void
proorder(bitree*
root)
{
if(root
==
NULL)
return;
printf("%d
",root->data);
proorder(root->lchild);
proorder(root->rchild);
}//這是根左右遍歷即前序遍歷,如果想改成中序或者後序只需要把printf改到lchild後和rchild後即可
寫完才發現你要層次遍歷啊?!,那個還要引入個隊列的建立,需要建隊,出隊,入隊的函數,全寫出來很麻煩的,寫2x樹的都不是初學了,我假設你已經有了隊列相關函數,給出函數功能注釋,然後直接給你層次遍歷的函數吧:
void
noorder(bitree
*root)
{
sequeue
*sq;//用的順序隊列,沒有用鏈式的,要不更麻煩了,sequeue是typedef的隊列結構體
sq
=
CreatEmptySequeue();//建立空隊列
EnSequeue(sq,root);//根節點入隊
while(!EmptySequeue(sq))//判斷隊列是否空
{
root
=
Desequeue;//出列
printf("%d",root->data);
if(root->lchild
!=NULL)
EnSequeue(sq,root->lchild);
if(root->rchild
!=
NULL)
EnSequeue(sq
,root->rchild);
}
return;
}
演算法描述,
利用隊列的先進先出的特性,首先把根節點入隊列,然後開始循環,先判斷隊列是否空,取出隊首元素並列印,然後檢查出列節點的左節點,有的話入隊,沒有的話檢查右節點,有的話入隊,開始下次循環,這時隊列里是第二層的左節點和有節點,這次是先列印2層左節點,然後讓2層的左孩子節點入隊,右孩子入隊,然後列印2層右節點,然後2層右節點的左孩子入隊,右孩子入隊,隊列中現在是第3層節點左邊依次向右,依次類推,層次列印2x樹
看在我折騰了那麼多,時隔這么久才有我給答案,分就別吝嗇了哈~~~嘿嘿

6. 關於二叉樹的建立與前序遍歷問題(c語言)

x=getchar();
getchar();你輸入的倆位數第二個字元不是「#」, if (x=='#') break;這個是不會結束的,而且底下的程序有問題,p=(struct node*)malloc(sizeof(struct node));
p->data=x;
p->llink=NULL;
p->rlink=NULL;
if (x<p->data) q->llink=p;
else q->rlink=p;
x都付給了p->data,下面還進行比較幹嘛?if (x<p->data)。

7. C語言數據結構樹的前序遍歷演算法求指教

首先創建二叉樹,個人喜歡用先序次序創建,如
int CreateBiTree(Tree *T)// 按先序次序輸入二叉樹中結點的值,'#'字元表示空樹,構造二叉鏈表表示的二叉樹T
{
char ch;
scanf("%c",&ch);
if (ch=='#') T = NULL;
else {
if (!(T = (Tree *)malloc(sizeof(Tree)))) return ERROR;
T->data=ch; // 生成根結點
CreateBiTree(T->lchild); // 構造左子樹
CreateBiTree(T->rchild); // 構造右子樹
}
return OK;
}
再者,調用前序遍歷函數,再運用輸出函數輸出前序遍歷的二叉樹,如:
int Visit(int e ) // 輸出元素e的值
{
printf("%c", e );
return OK;
}
int main()
{
Tree *T;
CreateBiTree(T); //調用按先序次序輸入二叉樹中結點的值(一個字元),構造二叉鏈
pre_order(T,Visit);//調用前序遍歷二叉樹演算法
}

8. 設計一個c語言程序,實現二叉樹的前序、中序、後序的遞歸、非遞歸遍歷運算

#include<malloc.h> // malloc()等
#include<stdio.h> // 標准輸入輸出頭文件,包括EOF(=^Z或F6),NULL等
#include<stdlib.h> // atoi(),exit()
#include<math.h> // 數學函數頭文件,包括floor(),ceil(),abs()等

#define ClearBiTree DestroyBiTree // 清空二叉樹和銷毀二叉樹的操作一樣

typedef struct BiTNode
{
int data; // 結點的值
BiTNode *lchild,*rchild; // 左右孩子指針
}BiTNode,*BiTree;

int 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表示空(子)樹。修改
int number;
scanf("%d",&number); // 輸入結點的值
if(number==Nil) // 結點的值為空
T=NULL;
else // 結點的值不為空
{ T=(BiTree)malloc(sizeof(BiTNode)); // 生成根結點
if(!T)
exit(OVERFLOW);
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("先序遞歸遍歷二叉樹: ");
PreOrderTraverse(T,visit); // 先序遞歸遍歷二叉樹T
printf("\n中序遞歸遍歷二叉樹: ");
InOrderTraverse(T,visit); // 中序遞歸遍歷二叉樹T
printf(" \n後序遞歸遍歷二叉樹:");
PostOrderTraverse(T,visit); // 後序遞歸遍歷二叉樹T
printf("\n");
}