編程樹問題
㈠ 計算機軟體基礎一二叉樹編程題,這道題有部分地方看不懂
malloc(sizeof(BTNode))是申請一個指定位元組數的內存空間,並將首地址賦值給指針變數t。
malloc是動態隨機分配內存空間的方法。可以根據需要分配內存空間給程序使用
(BTNode *)malloc(sizeof(BTNode))的意思是,動態分配空間為結構體BTNode位元組數大小的空間,並指定此空間為BTNode類型。
sizeof是關鍵字,意為取……的位元組數。
㈡ C語言編程題:一個二叉樹構造問題
給你樹的實現方法,以前寫的,你可以先思考一下// main.cpp// BTree(二叉樹的實現)//#include #include using namespace std;//二叉樹的每個節點class TreeNode {public: //無參構造方法 TreeNode() { left = right = 0; } //有參構造方法
㈢ 編程問題,樹的枚舉,求演算法
不是很懂你的意思。
1.什麼叫不同結構?
2.是否是給出一些樹,然後按結構把這些樹分成幾組?
你的意思是,給出節點數,然後計算出可以組成多少種樹?
㈣ 二叉樹編程問題
/*已經修改*/
/*輸入樣例:abd@ei@j@@f@@cg@h@@@@其中@表示空格*/
/*二叉樹以先序輸入的方法,其中必須補為完全二叉樹:即葉子結點下面也要掛空指針。如輸入abc@@@@。*/
#include<stdio.h>
#include<malloc.h>
typedef char datatype;
typedef struct _node{
datatype data;
struct _node *lchild,*rchild;
}BTnode;/*結點定義*/
typedef BTnode *BinTree;/*根指針定義*/
void CreateBinTree(BinTree *T)/*此函數使用地址傳遞。根指針T在函數中被指向二叉數的根結點*/
{
char ch;
if((ch=getchar())==' ') *T=NULL;
else {
*T=(BTnode *)malloc(sizeof(BTnode));/*T始終是二叉樹的根結點(遞歸用的僅僅是左右結點*/
(*T)->data=ch;
CreateBinTree(&((*T)->lchild));/*注意 地址傳遞,若傳遞BTnode *型,如:T->lchild;則表示是傳遞其中的內容,沒有意義(在前面用BTnode *p定義的話)*/
CreateBinTree(&((*T)->rchild));
}
}
void Inorder(BinTree T)/*中序*/
{
if(T!=NULL)
{
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
}
}
void Preorder(BinTree T)/*前序*/
{
if(T!=NULL)
{
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
void postorder(BinTree T)/*後序*/
{
if(T)
{
postorder(T->lchild);
postorder(T->rchild);
printf("%c",T->data);
}
}
int main()
{
BinTree root;/*根結點指針定義*/
CreateBinTree(&root);/*傳入根結點指針的地址在函數中指向二叉樹根*/
Preorder(root);
}
㈤ 入門C語言編程植樹問題
程序本身是沒問題的,但是可能是輸出格式的問題,一般OJ題目都有嚴格的輸入輸出檢測的。
題目的output中是:5[空格]3
#include<stdio.h>
intmain(void)
{
intm,n;
scanf("%d%d",&m,&n);
printf("%d%d",m/n,m%n);
return0;
}
㈥ 一個出現在C語言編程題的二叉樹問題
先序第一個為根節點,後序第一個為最左下節點,先序最後一個為最右下節點,注意到,先序里b,d,e,後序里d,e,b,由此知道,b為,d,e的父母節點,做到一半,發現你的後序好像寫錯了,-
-!。g在f後面吧。要不然就是前序的錯了。忽略的你的錯誤,可以知道,c,f,g這三個節點的關系。由後序規律,可以知道這兩科子樹和根節點的關系。畫出樹,在用中序遍歷一下就出來了。順便說一下,先序就是先讀根節點在讀取左節點,最後讀取右節點。中序,後序的話就是讀取根節點的順序問題。還有二叉樹嘛,就是一個節點最多隻有的兩個分叉的樹。
-
-!
㈦ 編程中的樹的遍歷分為哪三種
前序遍歷
中序遍歷
後序遍歷
這是數據結構這門課程中關於樹的知識,這章是很重要也很有意思的,能衍生出很多實際問題。
㈧ 編程關於樹的問題
這個是c++程序,呵呵
顯示的是後續遍歷
#include<iostream.h>
typedef struct TreeNode
{
int key;
struct TreeNode *left;
struct TreeNode *right;
}treeNode;
class BiSortTree
{
public:
BiSortTree(void);
void desplayTree(void);//顯示這個樹
void insertTree(int key);//在樹中插入一個值
deleteTree(int key);//在樹中刪除一個值
treeNode* searchTree(int key);//在樹中查找一個值
~BiSortTree();
private:
treeNode* buildTree(treeNode* head,int number);//建立一個樹
treeNode* search(treeNode* head ,int key);//查找
treeNode* BiSortTree::searchParent(treeNode* head,treeNode* p);//查找出p的父親節點的指針
treeNode* BiSortTree::searchMinRight(treeNode* head);//找到右子樹中最小的節點
void showTree(treeNode* head);//顯示
void destroyTree(treeNode* head);//刪除
treeNode *Head;
};
/**************以下是建立一個二叉排序樹****************/
BiSortTree::BiSortTree()
{
cout<<"建立一棵二叉排序樹,請輸入你要建樹的所有數(以-1 作為結束標志!): "<<endl;
Head=NULL;
int number;
cin>>number;
while(number!=-1)
{
Head=buildTree(Head,number);
cin>>number;
}
}
treeNode* BiSortTree::buildTree(treeNode* head,int number)
{
treeNode *p;
p=new treeNode;
p->key=number;
p->left =p->right=NULL;
if(head==NULL)
{
return p;
}
else
{
if(p->key <head->key)
head->left=buildTree(head->left,number);
else
head->right=buildTree(head->right,number);
return head;
}
}
/*****************以下是在一棵二叉排序樹插入一個數***********************************/
void BiSortTree::insertTree(int key)
{
Head=buildTree(Head,key);
}
/*****************以下是在一個二叉排序樹查找一個數是否存在*************************/
treeNode* BiSortTree::searchTree(int key)
{
return search(Head,key);
}
treeNode* BiSortTree::search(treeNode* head ,int key)
{
if(head==NULL)
return NULL;
if(head->key==key)
return head;
else
{
if(key<head->key )
return search( head->left,key);
else
return search(head->right,key);
}
}
/************以下是在一個二叉排序樹刪除一個給定的值*********************************/
BiSortTree::deleteTree(int key)
{
treeNode *p;
p=NULL;
p=search(Head,key);
if(p==NULL)
{
cout<<"Don't find the key";
}
if(p==Head)
{
Head=NULL;
}
else
{
treeNode* parent;
parent=searchParent(Head,p);
if(p->left==NULL&&p->right==NULL)//葉子節點
{
if(parent->left==p)
{
parent->left=NULL;
}
else
{
parent->right=NULL;
}
}
else//非葉子節點
{
if(p->right==NULL)//該節點沒有右孩子
{
if(parent->left==p)
{
parent->left=p->left ;
}
else
{
parent->right=p->left;
}
}
else//該點有左右孩子
{
treeNode * rightMinSon,* secondParent;//secondParent為右子樹中的最小節點的父親
rightMinSon=searchMinRight(p->right);
secondParent=searchParent(p->right ,rightMinSon);
secondParent->left=rightMinSon->right;
if(p->right==rightMinSon)//右子樹中的最小節點的父親為p
{
p->right=rightMinSon->right ;
}
p->key=rightMinSon->key ;
}
}
}
}
treeNode* BiSortTree::searchParent(treeNode* head,treeNode* p)
{
if(head->left==p||head->right==p||head==p||head==NULL)
return head;
else
{
if(p->key<head->key)
return searchParent(head->left ,p);
else
return searchParent(head->right ,p);
}
}
treeNode* BiSortTree::searchMinRight(treeNode* head)//找到右子樹中最小的節點
{
if(head->left ==NULL||head==NULL)
{
return head;
}
else
{
return searchMinRight(head->left);
}
}
/*****************以下是顯示一個二叉排序樹****************************************/
void BiSortTree::desplayTree(void)
{
showTree(Head);
cout<<endl;
}
void BiSortTree::showTree(treeNode* Head)
{
if(Head!=NULL)
{
showTree(Head->left ) ;
cout<<Head->key<<' ' ;
showTree(Head->right) ;
}
}
/*****************以下是刪除一棵整二叉排序樹************************************/
BiSortTree::~BiSortTree()
{
cout<<"已經消除了一棵樹!!!!"<<endl;
destroyTree(Head);
}
void BiSortTree::destroyTree(treeNode* head )
{
if(head!=NULL)
{
destroyTree(head->left );
destroyTree(head->right );
delete head;
}
}
/*********************/
void print()
{
cout<<endl<<endl<<"以下是對二叉排序樹的基本操作:"<<endl
<<"1.顯示樹的中序遍歷"<<endl
<<"2.插入一個節點"<<endl
<<"3.尋找一個節點"<<endl
<<"4.刪除一個節點"<<endl;
}
void main()
{
BiSortTree tree;
int number;
int choiceNumber;
char flag;
while(1)
{
print() ;
cout<<"請選擇你要進行的操作(1~4)"<<endl;
cin>>choiceNumber;
switch(choiceNumber)
{
case 1:
tree.desplayTree();break;
case 2:
cout<<"請插入一個數: "<<endl;
cin>>number;
tree.insertTree(number);
tree.desplayTree();
break;
case 3:
cout<<"請插入你要找數: "<<endl;
cin>>number;
if(tree.searchTree(number)==NULL)
{
cout<<"沒有發現"<<endl;
}
else
{
cout<<"發現"<<endl;
}
break;
case 4:
cout<<"請輸入你要刪除的數: "<<endl;
cin>>number;
tree.deleteTree(number);
tree.desplayTree();
break;
default: break;
}
cout<<"你是否要繼續(Y/N)?"<<endl;
cin>>flag;
if(flag=='N'||flag=='n')
break;
}
}
㈨ 數據結構創建二叉樹編程問題
//這個題目挺有意思的,很喜歡,你看看我這個咋樣啊?
#include<stdio.h>
#include<malloc.h>
typedef
char
ElemType
;
typedef
struct
node
{
ElemType
data
;
struct
node
*lchild
;
struct
node
*rchild
;
}BTree,*pBTree
;
//先序創建樹
void
CreateBTree(pBTree
*T)
//此處參數應該用指針的指針,應給它要改變指向二叉樹根的那個指針
{
char
ch
;
ch=getchar();
getchar();
//得到回車按那個字元
if(ch
=='
')
//輸入空字元時要打空格
{
(*T)
=
NULL
;
return
;
}
else
{
if(
!(
(*T)
=
(pBTree)
malloc(sizeof(BTree))
)
)
return
;
(*T)->data
=
ch
;
CreateBTree(
&(*T)->lchild
);
CreateBTree(
&(*T)->rchild
);
}
}
void
BTreePrint(BTree
*Tr,int
n)
//逆時針旋轉90°列印二叉樹,n為縮進層數,初始值為0
{
int
i;
if(Tr
==
NULL)
return;
BTreePrint(Tr->rchild,n+1);
for(i
=
0;i<n;i++)
printf("
");
if(n
>=
0)
{
printf("--");
printf("%c\n",Tr->data);
}
BTreePrint(Tr->lchild,n+1);
}
void
main()
{
pBTree
bTree
;
CreateBTree(&bTree);
BTreePrint(bTree,0);
}
輸入舉例:建立以A為根B、C分別為左右子樹的二叉樹!輸入格式為:
A
回車!
B
回車!
空格
回車!
空格
回車!
C
回車!
空格
回車!
空格
回車!
㈩ 二叉樹的編程問題
//這個題目挺有意思的,很喜歡,你看看我這個咋樣啊?
#include<stdio.h>
#include<malloc.h>
typedef char ElemType ;
typedef struct node
{
ElemType data ;
struct node *lchild ;
struct node *rchild ;
}BTree,*pBTree ;
//先序創建樹
void CreateBTree(pBTree *T)
//此處參數應該用指針的指針,應給它要改變指向二叉樹根的那個指針
{
char ch ;
ch=getchar();
getchar(); //得到回車按那個字元
if(ch ==' ') //輸入空字元時要打空格
{
(*T) = NULL ;
return ;
}
else
{
if( !( (*T) = (pBTree) malloc(sizeof(BTree)) ) ) return ;
(*T)->data = ch ;
CreateBTree( &(*T)->lchild );
CreateBTree( &(*T)->rchild );
}
}
void BTreePrint(BTree *Tr,int n)
//逆時針旋轉90°列印二叉樹,n為縮進層數,初始值為0
{
int i;
if(Tr == NULL) return;
BTreePrint(Tr->rchild,n+1);
for(i = 0;i<n;i++)
printf(" ");
if(n >= 0)
{
printf("--");
printf("%c\n",Tr->data);
}
BTreePrint(Tr->lchild,n+1);
}
void main()
{
pBTree bTree ;
CreateBTree(&bTree);
BTreePrint(bTree,0);
}
輸入舉例:建立以A為根B、C分別為左右子樹的二叉樹!輸入格式為:
A 回車!
B 回車!
空格 回車!
空格 回車!
C 回車!
空格 回車!
空格 回車!