森林轉換c語言,隨機森林c語言

本文目錄一覽:

將森林轉化為二叉樹得到二叉樹正好是一個滿二叉樹羅曼二叉樹中有n個節點那麼

C.n+1

森林轉換為二叉樹,遵循”左兒子右兄弟”的說法.

舉個例子.樹:根節點有三個兒子A,B,C.那麼轉換為二叉樹後,根節點只有一個兒子A,然後A的兄弟B成為A的”兒子”(或者可以說是右指針域),C成為B的右指針域,此時C已經沒有兄弟了,所以到此的一個右指針域為空.(你可以畫圖體會一下.)

題目中說F有n個非終端節點,所以轉換為二叉樹後所有的空的右指針域(right)就是n個.

根節點沒有兄弟,所以該右指針域也為空.(注:這裡根節點也是一個有指針域.上文中根節點屬於非終端節點,那裡它所指向的右指針域不是它本身而是它的最右邊的兒子.)

所以綜上,二叉樹中右指針域為空的節點有(n+1)個.

樓主,這個我也是初學,有些語言不標準之處見諒.

《森林與二叉樹的轉換》C語言代碼

#includestdio.h

#includemalloc.h

#define DEGREE 5 //樹的高度

#define NULL 0

#define QUEUESIZE 10

#define MAX_NODE_NUM 100

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@樹和二叉樹的結構體@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

typedef struct st1//樹節點的類型

{

char data;//數據域,採用char星

struct st1 *children[DEGREE];//指向孩子節點的指針域

}CTreeNode;

typedef struct st2

{

char data;//數據域

struct st2 *lchild,*rchild;//左右孩子節點的指針

}BTreeNode;

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@查找樹的節點@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

CTreeNode *SearchCTree(CTreeNode *root ,char data)

{

int i;

CTreeNode *returnNode;

if(root-data==data)

return root;

else

{

for(i=0;iDEGREE;i++)

{

if(root-children[i]==NULL)

return NULL;

else

{

returnNode=SearchCTree(root-children[i],data);//遞歸查找

if(returnNode!=NULL)

return returnNode;

}

}

}

}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@生成樹@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

CTreeNode *CreateSTree()

{

int i,j,k;

char data, parent;;

CTreeNode *root,*parentNode,*node;

printf(“請輸入樹的節點的數量:”);

scanf(“%d”,j);

fflush(stdin);//清除鍵盤緩存

if(j==0)

return NULL;//空樹,結束函數

printf(“請輸入根節點的數據:”);

scanf(“%c”,data);

fflush(stdin);

root=(CTreeNode *)malloc(sizeof(CTreeNode));

root-data=data;

for(i=0;iDEGREE;i++)

root-children[i]=NULL;

for(i=2;i=j;i++)//依次輸入每個節點的信息

{

printf(“請輸入第%d個節點的數據及其父節點的數據:”,i);

scanf(“%c%c”,data,parent);//切記當以%c號格式輸入數據時候,不要輸入空格

fflush(stdin);

node=(CTreeNode *)malloc(sizeof(CTreeNode));

node-data=data;

for(k=0;kDEGREE;k++)

node-children[k]=NULL;

//printf(“驗證parent=%c\n”,parent);

parentNode=SearchCTree(root,parent);//查找指定數據的節點

for(k=0;kDEGREE;k++)

{

if(parentNode-children[k]==NULL)

{

parentNode-children[k]=node;

break;

}

}

}

return root;

}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@樹的遍歷@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

void preorderTree(CTreeNode *ctroot)//遍歷每個節點的操作就是輸出該節點的data域

{

CTreeNode *ctchild;

int i;

printf(“%c”,ctroot-data);//先遍歷根節點

for(i=0;iDEGREE;i++)//依次先序遍歷孩子節點

{

ctchild=ctroot-children[i];

if(ctchild==NULL)

break;//孩子節點遍歷結束,退出

else

preorderTree(ctchild);//遞歸先序遍歷

}

}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@結構體類型@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

//樹隊列結構體類型

typedef struct nodeCTree

{

CTreeNode *CTreeArray[MAX_NODE_NUM];//結構體指針數組,存放節點的地址

//struct nodeCTree *next;

int CTreeFront,CTreeRear;

}QueueCTree;

//二叉樹隊列結構類型

typedef struct nodeBTree

{

BTreeNode *BTreeArray[MAX_NODE_NUM];//結構體指針數組,存放節點的地址

//struct nodeBTree *next;

int BTreeFront,BTreeRear;

}QueueBTree;

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@初始化隊列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

//初始化樹隊列

void initQueueCTree(QueueCTree *q)

{

q=(QueueCTree *)malloc(sizeof(QueueCTree));

q-CTreeFront=q-CTreeRear=0;

}

//初始化二叉樹隊列

void initQueueBTree(QueueBTree *q)

{

q=(QueueBTree *)malloc(sizeof(QueueBTree));

q-BTreeFront=q-BTreeRear=0;

}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@入隊列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

//樹隊列元素入隊

int addQueueCTree(QueueCTree *q,CTreeNode *ctroot)//

{

if((q-CTreeRear+1)%MAX_NODE_NUM==q-CTreeFront)//隊滿

return 0;

q-CTreeRear=(q-CTreeRear+1)%MAX_NODE_NUM;

q-CTreeArray[q-CTreeRear]=ctroot;

return 1;//入隊列

}

//二叉樹隊列元素入隊

int addQueueBTree(QueueBTree *q,BTreeNode *btroot)

{

if((q-BTreeRear+1)%MAX_NODE_NUM==q-BTreeFront)//隊滿

return 0;

q-BTreeRear=(q-BTreeRear+1)%MAX_NODE_NUM;

q-BTreeArray[q-BTreeRear]=btroot;

return 1;//入隊列

}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@隊列判空@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

//樹的隊列判空

int QueueCTreeEmpty(QueueCTree *q)

{

return(q-CTreeFront==q-CTreeRear);

}

//二叉樹隊列判空

int QueueBTreeEmpty(QueueBTree *q)

{

return(q-BTreeFront==q-BTreeRear);

}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@出隊列@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

//樹隊列元素出隊

CTreeNode *delQueueCTree(QueueCTree *q)

{

CTreeNode *ctroot;

if(q-CTreeFront==q-CTreeRear)//隊空

return NULL;//返回空指針

q-CTreeFront=(q-CTreeFront+1)%MAX_NODE_NUM;

ctroot=q-CTreeArray[q-CTreeFront];

return ctroot;//返回節點

}

//二叉樹隊列元素出隊

BTreeNode *delQueueBTree(QueueBTree *q)

{

BTreeNode *btroot;

if(q-BTreeFront==q-BTreeRear)//隊空

return NULL;//返回空指針

q-BTreeFront=(q-BTreeFront+1)%MAX_NODE_NUM;

btroot=q-BTreeArray[q-BTreeFront];

return btroot;//返回節點

}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@樹轉化為二叉樹@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

void TreeToBTree(CTreeNode *ctroot,BTreeNode *btroot)//樹轉化為二叉樹ctroot指向樹的根節點,btroot,指向二叉樹的跟

{

QueueCTree *VisitedCTreeNodes;

QueueBTree *VisitedBTreeNodes;//輔助隊列

initQueueCTree(VisitedCTreeNodes);

initQueueBTree(VisitedBTreeNodes);//初始化隊列

CTreeNode *ctnode;

BTreeNode *btnode,*p,*LastSibling;

int i;

btroot=(BTreeNode *)malloc(sizeof(BTreeNode));//添加開闢內存空間語句

btroot-data=ctroot-data;//樹的根節點作為二叉樹的根節點

btroot-lchild=btroot-rchild=NULL;

addQueueCTree(VisitedCTreeNodes,ctroot);//樹的跟節點入隊

addQueueBTree(VisitedBTreeNodes,btroot);//二叉樹的跟節點入隊

while(!QueueCTreeEmpty(VisitedCTreeNodes))

{

ctnode=delQueueCTree(VisitedCTreeNodes);//樹節點出隊

btnode=delQueueBTree(VisitedBTreeNodes);//二叉樹節點出隊

for(i=0;iDEGREE;i++)//訪問節點所有的孩子節點

{

if(ctnode-children[i]==NULL)//孩子節點訪問完畢

break;

p=(BTreeNode *)malloc(sizeof(BTreeNode));//分配二叉樹節點

p-data=ctnode-children[i]-data;

p-lchild=p-rchild=NULL;

if(i==0)

btnode-lchild=p;//長子,作為父節點的做孩子

else

LastSibling-rchild=p;//作為上一個兄弟節點的右孩子

LastSibling=p;

addQueueCTree(VisitedCTreeNodes,ctnode-children[i]);//樹節點進隊列

addQueueBTree(VisitedBTreeNodes,p);//二叉樹節點進門隊列

}

}

}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉樹的遍歷@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

void Preorder(BTreeNode *T)

{

if(T)

{

printf(“%2c”,T-data);

Preorder(T-lchild);

Preorder(T-rchild);

}

}

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@主函數調用@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

int main()

{

CTreeNode *Tree;

BTreeNode *BTree;

printf(“創建一棵樹\n”);

Tree=CreateSTree();

printf(“樹的先序遍歷結果為:”);

preorderTree(Tree);

printf(“\n”);

TreeToBTree(Tree,BTree);

printf(“轉換後的二叉樹,先序遍歷的結果為:”);

Preorder(BTree);

printf(“\n”);

return 0;

}

你好!我想問一下如何用c語言實現生成一個隨機的森林。

#include iostream

using namespace std;

int main()

{

srand((unsigned)time( NULL));

int n;

cinn;

cout’\n’;

int rand1[n];

bool temp=1;

int a,flag=0;

A: for(int i=0;in;i++)

{

a=rand()%(n+50)+1;

if(a==rand1[i])temp=0;

}

flag++;

if(temp)rand1[flag]=a;

if(flagn)goto A;

for(int i=0;in;i++)coutrand1[i]’\n’;

system(“pause”);

return 0;

}

森林和二叉樹轉換的c或c++代碼

你好,尊敬的百度知道用戶樓主,很願意為你問題作答

1、轉換:將森林中的每棵樹轉換成二叉樹; 2、連線:第一顆樹不動,從第二棵樹開始,依次把後一棵樹的根節點座位前一棵樹的根節點的右孩子,知道所有的二叉樹都連在一起,即完成了森林向二叉樹的轉換。 3、旋轉:以根節點為軸心,將整棵樹順時針旋轉一定角度,得到層次分明的二叉樹。

將一棵二叉樹轉化成森林,可按如下步驟進行:

①抹線:將二叉樹根結點與其右孩子之間的連線,以及沿着此右孩子的右鏈連續不繼搜索到的右孩子間的連線抹掉。這樣就得到了若干棵根結點沒有右子樹的二叉樹。

②將得到的這些二叉樹用前述方法分別轉化成一般樹。

首先你要對一些基本概念掌握清楚。祝你好運!!

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/298107.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-28 12:17
下一篇 2024-12-28 12:17

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論