『壹』 c語言中,到底先序遍歷、中序遍歷、後續遍歷怎麼看的...真的快瘋掉了!求高人指點指點...淚目
先序遍歷就是「根左右」,不管你現在在哪個節點,都是按這種規則。上面的題目:根是A,左是B,右是C,所以是A-》B,在當前根節點B,還是按上述規則,那麼接下來到D,D之後沒有子節點,返回B,遍歷E-》X,X之後沒有子節點,返回E,E的子節點都遍歷完了,返回B,B的子節點都遍歷完了,返回A,接下來遍歷右子樹,規則同上。
中序遍歷就是「左根右」,對於A來說,先遍歷B,對於B來說,先遍歷D,對於D來說,已經沒有左子樹,所以遍歷D,D沒有右子樹,返回B,遍歷B,B有右子樹E,對於E來說,先遍歷X,完了返回E,E完了返回B,B完了返回A,遍歷A,遍歷右子樹,規則同上。
後序遍歷就是跟先序遍歷相反的,先遍歷右子樹,再左子樹,最後才是根。
好好思考一下。
『貳』 C語言數據機構:由中序遍歷和層次遍歷能不能唯一確定一顆二叉樹為什麼說法不一致哪
由中序遍歷和層次遍歷能夠唯一確定一顆二叉樹。從下面的演算法可知,每一步構造得到的二叉樹結果是唯一的。
以下構造部分的答案來自網路知道:
假定樹的層次遍歷ABCDEFG
HIJ中序遍歷DBGEHJACIF
兩種遍歷順序要結合著分析,才能畫出這顆樹的圖
比如,層次遍歷,先訪問到A節點,說明A是樹的根節點
那麼在中序遍歷結果里看:
DBGEHJ在A前面,說明這些節點,都在A左子樹上
CIF在A的後面,說這些節點,都在A的右子樹上
那麼,樹可以先這樣畫:
__________A________
________/____\_____
_____DBGEHJ__CIF___
再看層次遍歷,A後面是B,說明B是A左子樹的根節點
從上圖中的先序遍歷順序DBGEHJ中看到:
D在B的前面,說明D在B的左子樹上
GEHJ在B的後面,說明它們在B的右子樹上
那麼,樹又可以畫成:
_________A________
_______/____\_____
_____B________CIF__
____/__\____________
___D__GEHJ_________
如此循環,直到將整個樹都畫完全
結果如下:
_____________A_______________
___________/____\_____________
________B_________C__________
______/___\_________\_________
_____D_____E_________F_______
__________/__\_________\______
_________G____H_________I____
_______________\______________
_________________J____________
『叄』 c語言 關於二叉樹的創建和遍歷(中序遍歷)
這個還是我學《數據結構》時做的有關二叉樹的練習呢,本來是全的,包括樹的初始化,建立,遍歷(中序、前序、後序和層次),還有輸出,復制,刪除節點,求深度,樹的刪除等等,看你只問了有關創建和中序遍歷的,所以選了一部分給你,供你參考吧!
#include <stdio.h>
#include <malloc.h>
#define MaxSize 10
#define Number 30
struct BiTNode{//定義數據結構
char data;
BiTNode *lchild,*rchild;
};
void InitBtree(BiTNode * &BT){//初始化二叉樹
BT=NULL;
}
void CreateBiTree(BiTNode *&BT,char *str){//建立二叉樹
BiTNode *s[MaxSize];//這里定義了一個數組用作堆棧方便檢查輸入和操作
int top=-1;
BT=NULL;
BiTNode *p=NULL;
int k, j=0;
char ch;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(':
top++;
s[top]=p;
k=1;
break;
case ')':
top--;
break;
case ',':
k=2;
break;
default:
p=(struct BiTNode *) malloc(sizeof(struct BiTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(BT==NULL)
BT=p;
else{
if(k==1)
s[top]->lchild=p;
else
s[top]->rchild=p;
}
}
j++;
ch=str[j];
}
}
void inorder(BiTNode *BT){//中序遍歷二叉樹——遞歸形式
if(BT!=NULL){
inorder(BT->lchild );
printf("%c ",BT->data);
inorder(BT->rchild );
}
}
void main(){
BiTNode *BT;
printf("以廣義表形式表示輸入的二叉數 (如A(B(C,D),E(,F))的形式)\n\n");
char string[Number]="A(B(,C),D(E(F),G(,H)))";
//如果想要自己輸入,可以將下邊的注釋去掉,然後自己按照廣義表形式輸入,
//(如上例的形式)此處為了方便查看,用了默認的數值
//這里之所以用此種形式(廣義表形式輸入)是為了保證輸入的數組成的二叉樹完全符合你所定義的樹的形狀
/*char string[Number],ch;
int i=0;
ch=getchar();
while(ch!='\n' && i<Number){
string[i]=ch;
i++;
ch=getchar();
}
string[i]='\0';
*/
InitBtree(BT);//初始化二叉樹
CreateBiTree(BT,string);//創建二叉樹
printf("\n中序遍歷二叉樹順序為: ");
inorder(BT);//中序遍歷二叉樹
printf("\n");
}
程序不復雜,所以只是加了必要和最簡單的注釋,相信你看看應該完全可以理解的,祝你進步!
『肆』 C語言中,前序遍歷,中序遍歷各什麼意思
前序遍歷:先訪問根節點,然後訪問左子樹,再訪問右子樹。
中序遍歷:先訪問左子樹,然後訪問根節點,再訪問右子樹。
『伍』 C語言利用棧 進行中序遍歷
typedefcharTElemType;
typedefintStatus;
typedefcharSElemType;
typedefstructBiTNode{
TElemTypedata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
typedefstruct
{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
StatusInOrderTraverse(BiTreeT)
{
SqStackS;
BiTNode*p;
InitStack(&S);
p=T;
while(p||!EmptyStack(S))
{
if(p)
{
push(&S,*p);p=p->lchild;
}
else
{
pop(&S,p);
if(!p->data)returnERROR;
printf("%d",p->data);
p=p->rchild;
}
}
returnOK;
}
『陸』 中序遍歷二叉樹(C語言)
#include<stdio.h>
inttree[1000];
intm;
voidmidorder(inti){
if(i>=m||tree[i]==0)return;
midorder(i*2+1);
printf("%d",tree[i]);
midorder(i*2+2);
}
voidsolve(){
inth=1;
while((1<<h)<=m)++h;
printf("%d",h);
midorder(0);
printf(" ");
}
intmain(){
inti,n,t;
scanf("%d",&n);
for(i=0;i<n;++i){
m=0;
while(scanf("%d",&t)>0&&t>=0){
tree[m++]=t;
}
solve(0);
}
}
『柒』 C語言 關於二叉樹的中序遍歷問題 急急急!!今晚就要交
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node *lchl,*rchl;
} NODE;
NODE *create(NODE *t) //函數帶有返回值 以影響調用者
{
int a;
scanf("%d",&a);
if(a)
{
t=(NODE*)malloc(sizeof(NODE));
t->data=a ;
t->lchl = create(t->lchl);
t->rchl = create(t->rchl);
return t ; // 此處返回剛才申請單元的指針 t
}
else
return NULL; // 無子樹返回 NULL
}
void print(NODE *T) //中序遍歷
{
if(T)
{
print(T->lchl);
printf("%4d",T->data);
print(T->rchl);
}
}
void main()
{
NODE *root;
root = create(root) ; // 接收返回值
print(root);
printf("\n") ;
}
『捌』 二叉樹的建立、中序遍歷(用C語言實現)
#include "iostream.h"
//#include "exception.h"
//樹節點類
int count=0,mode=0,data=0;
class BinaryTreeNode
{
friend class BinaryTree;
public :
BinaryTreeNode()
{
LeftChild = RightChild = 0;
}
BinaryTreeNode(const int& e)
{
data = e;
LeftChild = RightChild = 0;
}
BinaryTreeNode(const int& e, BinaryTreeNode *l,BinaryTreeNode *r)
{
data = e;
LeftChild = l;
RightChild = r;
}
private :
int data;
BinaryTreeNode *LeftChild, //左子樹
*RightChild; // 右子樹
} ;
class BinaryTree
{
friend class BinaryTreeNode;
public :
BinaryTree( )
{
root = 0;
}
~ BinaryTree( ) { }
bool IsEmpty( ) const
{
return ((root) ? false : true);
}
bool Root(int& x) const
{// 取根節點的d a t a域,放入x
// 如果沒有根節點,則返回f a l s e
if (root)
{
x = root->data;
return true;
}
else return false; // 沒有根節點
}
void MakeTree(const int& element)
{
root = new BinaryTreeNode (element);
}
void MakeTree(const int& element,BinaryTree& left,BinaryTree& right)
{// 將left, right和element 合並成一棵新樹
// left, right和this必須是不同的樹
// 創建新樹
root = new BinaryTreeNode (element, left.root, right.root);
// 阻止訪問l e f t和r i g h t
left.root = right.root = 0;
}
void Inorder(void (*Visit) (BinaryTreeNode *u))
{
InOrder ( Visit,root ) ;
}
void Delete( )
{
PostOrder (Free,root);
root = 0;
}
private :
BinaryTreeNode *root; // 根節點指針
static void Free(BinaryTreeNode *t)
{
delete t;
}
void InOrder(void(*Visit) (BinaryTreeNode *u),BinaryTreeNode *t)
{// 中序遍歷
if (t)
{
InOrder(Visit, t->LeftChild);
Visit( t ) ;
InOrder( Visit, t->RightChild);
}
}
『玖』 c語言中序遍歷怎麼做
求採納
『拾』 C語言二叉樹中序遍歷問題
#include<stdio.h>
#include<stdlib.h>
typedef struct BitNode{
char data;
struct BitNode *lchild,*rchild;
}BitNode,*BiTree;
typedef struct{
BiTree base;
BiTree top;
int stacksize;
}SqStack;
int InitStack(SqStack &S){
S.base=(BitNode *)malloc(100*sizeof(BitNode));
if(!S.base) exit (-2);
S.top = S.base;
S.stacksize=100;
return 1;
}
int StackEmpty(SqStack S){
if(S.top==S.base) return 1;
else return 0;
}
int Push(SqStack &S,BiTree e){
if(S.top-S.base>=S.stacksize){
S.base=(BitNode *)realloc(S.base,(S.stacksize+10)*sizeof(BitNode));
if(!S.base) exit(-2);
S.top=S.base+S.stacksize;
S.stacksize+=10;
}
// *S.top++=*e;
*(++S.top)=*e;
return 1;
}
int Pop(SqStack &S,BiTree &e){
if(S.top==S.base) return -1;
//*e=*--S.top;
e=S.top--;
return 1;
}
int GetTop(SqStack S,BiTree &e){
if(S.top==S.base) return -1;
// *e=*(S.top-1);
e=S.top;
return 1;
}
int CreateBiTree(BiTree &T){
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else {
if(!(T=(BitNode *)malloc(sizeof(BitNode)))) exit(-2);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 1;
}
int InOrderTraverse(BiTree T){
BiTree p;
SqStack S;
InitStack(S);
p=T;
while(p!=NULL||!StackEmpty(S)){
if(p!=NULL) {
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);
printf("%c",p->data);
p=p->rchild;
}
}
return 1;
}
int main()
{
BiTree T;
CreateBiTree(T);
InOrderTraverse(T);
getchar();
getchar();
return 1;
}
ps:中序遍歷演算法沒問題,問題出在棧的使用上,你判斷棧為空的條件是s.top==s.base,所以第一個空間不能使用,當作判斷條件。還有就是你放進棧的是樹的節點,那麼pop出來就只要改變一下指針就好了
隨便說一下,為什麼要把樹的節點放進棧中,可以把指向樹的節點的指針放進棧中啊。