1. 程式人生 > >C語言建立二叉樹過程中遇到的一些問題

C語言建立二叉樹過程中遇到的一些問題

其實這些問題以前也遇到過,不過沒總結,遇到又要搞段時間,現在總結下。
比如我們要建立顆如下二叉樹,按前序輸入,則為AB#D##C##:

開始程式碼寫成下面這樣:

#define TElemType char

typedef struct BiTNode {
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;  

void CreateBiTree(BiTree T) {
	TElemType ch;
	scanf("%c",&ch);
	if(ch == '#') {	
		T = NULL;
	} else {
		T = (BiTree)malloc(sizeof(BiTNode));
		T->data = ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
		return T;
	}
}

其實這種錯誤和下面這種a,b無法被交換本質上是一樣的,只是int型別變成了結構體指標型別:

#include<stdio.h>

void swap(int a,int b) {
	int temp = a;
	a = b;
	b = temp;
}

int main() {
	int a = 3,b = 4;
	swap(a,b);
	printf("%d %d\n",a,b);
}

所以類比兩個數交換時的處理方式,自然可以想到用下面這種方式來處理:
void CreateBiTree(BiTree *T) {
	TElemType ch;
	scanf("%c",&ch);
	if(ch == '#') {
		*T = NULL;
	} else {
		*T = (BiTree)malloc(sizeof(BiTNode));
		(*T)->data = ch;
		CreateBiTree(&(*T)->lchild);
		CreateBiTree(&(*T)->rchild);
	}
}

就是不是傳結構體指標的值,而是傳結構體指標的指標。

指標的指標不好理解,還有一種處理方式如下所示:

BiTree CreateBiTree() {
	TElemType ch;
	scanf("%c",&ch);
	if(ch == '#') {	
		return NULL; 
	} else {
		BiTree T = (BiTree)malloc(sizeof(BiTNode));
		T->data = ch;
		T->lchild = CreateBiTree();
	 	T->rchild = CreateBiTree();
		return T;
	}
}

我開始寫的程式就錯在在遞迴呼叫的時候沒有將返回值賦值給父節點的左右孩子。

最後給個正確的完整程式碼,並用前序遍歷輸出了構造的二叉樹:

#include<stdio.h>
#include<stdlib.h>

#define TElemType char

typedef struct BiTNode {
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;  

BiTree CreateBiTree() {
	TElemType ch;
	scanf("%c",&ch);
	if(ch == '#') {	
		return NULL; 
	} else {
		BiTree T = (BiTree)malloc(sizeof(BiTNode));
		T->data = ch;
		T->lchild = CreateBiTree();
	 	T->rchild = CreateBiTree();
		return T;
	}
}

void traverse(BiTree r) {
	if(r == NULL) {
		return;
	}
	printf("%c",r->data);
	traverse(r->lchild);
	traverse(r->rchild);
}

int main() {
	BiTree root;
	root = CreateBiTree();
	traverse(root);
	printf("\n");
}


如果你要用指標的指標來構建的話完整程式碼如下:

#include<stdio.h>
#include<stdlib.h>

#define TElemType char

typedef struct BiTNode {
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;  

void CreateBiTree(BiTree *T) {
	TElemType ch;
	scanf("%c",&ch);
	if(ch == '#') {
		*T = NULL;
	} else {
		*T = (BiTree)malloc(sizeof(BiTNode));
		(*T)->data = ch;
		CreateBiTree(&(*T)->lchild);
		CreateBiTree(&(*T)->rchild);
	}
}

void traverse(BiTree r) {
	if(r == NULL) {
		return;
	}
	printf("%c",r->data);
	traverse(r->lchild);
	traverse(r->rchild);
}

int main() {
	BiTree root;
	CreateBiTree(&root);
	traverse(root);
	printf("\n");
}


相關推薦

C語言建立過程遇到的一些問題

其實這些問題以前也遇到過,不過沒總結,遇到又要搞段時間,現在總結下。比如我們要建立顆如下二叉樹,按前序輸入,則為AB#D##C##: 開始程式碼寫成下面這樣: #define TElemTyp

C語言實現統計葉子結點的個數&度為1&度為2的結點個數

演算法思想 統計二叉樹中葉子結點的個數和度為1、度為2的結點個數,因此可以參照二叉樹三種遍歷演算法(先序、中序、後序)中的任何一種去完成,只需將訪問操作具體變為判斷是否為葉子結點和度為1、度為2的結點及統計操作即可。 #include <stdio.h> #include &

C語言實現建立&遍歷

演算法思想(重點是遞迴的使用)  利用擴充套件先序遍歷序列建立二叉連結串列 採用類似先序遍歷的遞迴演算法,首先讀入當前根結點的資料,如果是'.'則將當前 樹根置為空,否則申請一個新結點,存入當前根結點的資料,分別用當前根結點的 左子域和右子域進行遞迴呼叫,建立左、右子樹. 

c語言實現的遍歷和建立程式(附帶註釋)

/******************************************************************/ //樹的遞迴思想,把每個節點當作是一棵樹,以後序遍歷為例 //步驟1:訪問左子樹.2訪問右子樹3.列印當前節點的值 //在節點遍歷時如果

C語言實現的基本操作---建立、遍歷、求深度、求葉子結點

#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedefint ElemType;//資料型別 //定義二叉樹結構,與單鏈表相似,多了一個右孩子結點 typed

c語言實現的先序遍歷,序遍歷,後序遍歷

// new.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <MEMORY.H> #include <STRING.H&

C語言的基本運算

IT btree AS CA style pri != -- str • 二叉樹節點類型BTNode: 1 typedef struct node 2 { 3 char data; 4 struct node *lchild, *rch

C語言_的基本操作及常見面試題

本片部落格主要包含以下內容: 和二叉樹操作相關的佇列基本操作 初始化 入佇列 判斷佇列是否為空 出佇列,返回對頭元素 和二叉樹相關的棧的基本操作 初始化 入棧 出棧 判空 返回棧頂元素並出棧 返回棧頂元素不出棧

C語言實現各種基本運算的演算法

 包含如下函式: CreateBTree( BTNode * &b, char * str ) : 由 括號表 示 串 str 創 建二叉鏈b ; FindNode( BTNode * &b,  ElemType x ) : 返回data域 為 x的節

C語言線索

線索二叉樹步驟: 1、建立二叉樹 2、中序遍歷線索化 對每一個結點進行操作 (1)、無左孩子:Lsign為1,指向前驅 (2)、無右孩子:Rsign為1,指向後繼(想完成此操作需要設定一個全域性變數pre指向剛剛訪問過的結點) 3、建立一個頭結點,左子

C語言轉換為雙向連結串列

樹是一種重要的資料結構,尤其是二叉樹。二叉樹的用處比較廣泛,用得最多的樹就是二叉樹。 二叉樹的每個結點最多有兩個子結點,左邊的一般稱為左孩子,右邊的稱為右孩子。根節點兩邊 的稱為左子樹和右子樹。二叉樹

已知前序序兩個序列,建立序和後序也有)

本文主要講二叉樹的建樹,具體的說就是,題目給出你二叉樹的前序和中序,你來建樹,還有一個題目是給出中序和後序來建樹 第一題:A binary tree is a finite set of vertices that is either empty or consists

C語言實現的基本操作

       我在前面的部落格中講解了連結串列、棧和佇列,這些資料結構其實都是線性表,並且給出了詳細的實現。從今天開始,我們將要來學習樹,樹作為一種資料結構我們經常會用到,作為起步和基礎,我們先來實現二叉樹,也就是每個節點有不超過2個子節點的樹。對於樹的操作,最基本的建立、遍

C語言線索的實現

        線索二叉樹的主要操作,包含:以p為根節點的子樹中序線索化,帶頭結點的二叉樹中序線索化和遍歷線索二叉樹這幾個函式。         下面講一下實現程式碼:                    首先,依然是型別定義,並宣告一個全域性變數pre: typed

c語言實現的插入、查詢、刪除、列印

目錄: 二叉樹的關鍵概念: 每個節點是一個自引用結構體,形式如下: struct TreeNode { struct TreeNode *leftPtr; /* pointer to left subtree */

C語言實現的各種遍歷及求解深度

#include<stdio.h> #include<malloc.h> #define MAXSIZE 100 typedef char dataType; //二叉樹結構 typedef struct bnode{ dataType data; struct bnode *lC

C語言實現的插入和刪除

二叉樹的插入刪除://首先介紹二叉樹的插入:     //首先需要明白插入的規則:每個建好的結點p都需要從跟結點開始與根結點相比較資料域,如果根結點的資料域小於結點p,則接著將結點p與根結點的右子樹相比較,否則p將與根結點的左子樹相比較;     //繼續往下類推,一直到最後

leetcode 101. Symmetric Tree(C語言,遞迴,判對稱性)30

貼原題: 解析:   本題是給出一個二叉樹,讓判斷其是否左右對稱。   我的思路就是直接遞迴。新建一個遞迴函式,引數是其左右孩子節點,若兩個節點都存在且值相等則對稱,繼續比較其各自的左右孩子。

c語言實現連結串列)非遞迴後序遍歷

演算法思想 因為後序遍歷是先訪問左子樹,再訪問右子樹,最後訪問根節點。當用棧實現遍歷時,必須分清返回根節點時,是從左子樹返回的還是從右子樹返回的。所以使用輔助指標r指向最近已訪問的結點。當然也可以在節點中增加一個標誌域,記錄是否已被訪問。 #include<iost

c語言實現的基本操作--連結串列儲存

利用二叉連結串列儲存,並且利用遞迴的方法實現二叉樹的遍歷(前序遍歷、中序遍歷和後續遍歷)操作。 c語言具體實現程式碼如下: #include<stdio.h> #include<stdlib.h> #include<malloc.h>