本文目錄一覽:
- 1、將森林轉化為二叉樹得到二叉樹正好是一個滿二叉樹羅曼二叉樹中有n個節點那麼
- 2、《森林與二叉樹的轉換》C語言代碼
- 3、你好!我想問一下如何用c語言實現生成一個隨機的森林。
- 4、森林和二叉樹轉換的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