1. 程式人生 > >遞迴和非遞迴實現二叉樹的建立和三種遍歷

遞迴和非遞迴實現二叉樹的建立和三種遍歷

#include<stdio.h>
#include<stdlib.h>
#define SIZE 20

typedef struct Node{
        int data;
        struct Node *left, *right;
}TreeNode, *Tree;																																								
//功能要求
//二叉搜尋樹的建立和儲存,前序和中序,後序的遍歷(非遞迴)統計高度
//定義節點結構
//新增節點(遞迴思想實現)


void AddNode(Tree* TR,int key){
        //若頭節點為空,則申請記憶體
        if(*TR == NULL){
                 (*TR) = (Tree)malloc(sizeof(TreeNode));
                 (*TR)->data = key;  
                (*TR)->left = NULL;
                (*TR)->right = NULL;
        }
        //若比該節點值小,則是左子樹節點
        else if(((*TR))->data > key){
               AddNode(&((*TR)->left),key);
        }else if(((*TR))->data < key){
               AddNode(&((*TR)->right),key);
        }
		
}

//建立二叉搜尋樹
 void Init(Tree* TR,int arr[],int n){
        int i = 0;
        //若為空,申請記憶體
        
        for(i= 0; i<n; i++){
               AddNode(TR, arr[i]);
        }     
}

//遍歷樹(中序)  - 遞迴
void Middle_Search(Tree TR){
        if(TR){
                Middle_Search(TR->left);
                printf("%d ", TR->data);
                Middle_Search(TR->right);
        }
}

//非遞迴遍歷(中序)  使用棧的思想
void Middle_NoSearch(Tree Thead){
        //定義結構體指標陣列,作為棧的實現結構
        Tree queen[SIZE];
        int head = -1;

	//stop
        while(Thead != NULL || head != -1){      
                //先讓左子樹節點入棧
                while(Thead != NULL){
                        //入棧
                        queen[++head] = Thead;
                        Thead = Thead ->left;
                }

                if(head != -1){
                         //一直走到葉子節點
                        Thead = queen[head--];
                        printf("%d ", Thead->data);
                        //將當前接節點的右子樹節點入棧
                        Thead = Thead ->right;
                }

        }


}
//計算樹的深度
int Lenght(Tree HT){
        //需要比較左子樹和右子樹
        int rightDepth = 0, leftDepth = 0;
        if(HT ==NULL){
                return 0;
        }else{
                rightDepth = Lenght(HT->left)+1;
                leftDepth  = Lenght(HT->right)+1;
                return rightDepth >= leftDepth ? rightDepth : leftDepth;
        }

}

//

 
int main(){
        //不能有重複值
	    Tree head = NULL;
		int len= 0;

        int arr[11] = {5,3,4,1,7,8,2,6,0,9,10};
      
        Init(&head,arr,11);
        printf("遞迴中序遍歷:");
        Middle_Search(head);
        printf("\n");

        printf("非遞迴中序遍歷:");
        Middle_NoSearch(head);
        printf("\n");

	len = Lenght(head);
        printf("樹的深度: %d\n",len);
        return 0;
}

結果:

相關推薦

求第序列

btree har dex logs 由於 bsp int tin 推理 // 樹的結點的結構: struct TreeNode{ TreeNode* LChild; TreeNode* RChild; char data; };

python 實現的深度&&廣度優先

本文首發於公眾號「zone7」,關注獲取最新推文! 概述 前言 什麼是樹 什麼是二叉樹 深度優先 廣度優先 後記 前言 前面說到演算法被虐了,這回我要好好把它啃下來。哪裡跌倒就要從哪裡站起來。這是我複習演算法與資料結構時的小筆記,這裡就 po 出來,給大家

建立、先序、中序、後序深度

一、概念:         二叉樹遍歷:按指定的某條搜尋路徑訪問樹中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。         根節點N,按照先遍歷左子樹L再遍歷右子樹R的原則,常見的有三種:先

-已知兩求第

1,先序和中序,輸出後序 #include<iostream> #include<stack> using namespace std; const int N=1010; int n,pre[N],in[N]; //先序陣列和後序陣列 stack<int>

】根據兩順序確定結構(build-tree)

題目描述 輸入 第1行:二叉樹的前序遍歷順序第2行:中序遍歷順序 輸出 二叉樹的後序遍歷順序 樣例輸入 Copy (如果複製到控制檯無換行,可以先貼上到文字編輯器,再複製) ABCDEFGH CBEDAGHF 樣例輸出 CEDBHGFA -----------------

知道其他兩方式求另一

已知先序和中序 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *

已知 兩序列 求第序列

已知 前序和中序遍歷 求後序遍歷序列 struct node *creat(char *a, char *b, int n) { struct node *ptr; char

給出兩序列(含中序建立一顆先序

#include <iostream> #include <cstdio> #include <queue> #include <stack> #include <cstring> using namespace

已知某的某兩序列,求另一序列面試題解法總結(轉)

某二叉樹的後序遍歷序列為dabec,中序遍歷序列為debac,則前序遍歷序列為 。 A、acbed B、 decab C、 deabc D、 cedba 解法如下: 先在兩種遍歷序列中找臨近的兩個或三個字元(內容相同,但順序可能

先中後序方法)、層序 Java實現

第一部分:二叉樹結點的定義 二叉樹結點有三個屬性:資料域、左結點、右結點。構造方法寫三個引數,這樣建立結點的時候程式碼更簡潔,且要從葉子結點開始建立(從底往上建立)。注:如果只寫一個賦值引數的構造器,那麼建立節點的順序就無所謂了,但是建立二叉樹時要多寫幾行程式碼。 pack

系列(3)層序實現

按照層次序實現二叉樹遍歷。 對於上圖中的二叉樹,層次遍歷的實現結果如下 層次遍歷的過程天然地符合佇列這個資料結構,因此可以用佇列方法來非遞迴地實現層次遍歷。目前還不太清楚如何遞迴地實現層次遍歷,網上看到的一些解法,聲稱採用了遞迴方法進行層次遍歷,但是它們是在while迴

的深度優先dfs(前序、中序後序;

//前序遍歷 //遞迴實現:根左右 void preOrder1(BinTree *root) { if (root != NULL) { cout<<root->data<<endl; preOrder1(root->lch

【資料結構】的前中後與層次()

水一波作業 #include <iostream> #include <cstring> //#pragma GCC optimize(2) #include<time.h> #include <map> #include &

建立及深度計算

上篇咱們說到二叉樹的一種建立方法及三種遍歷方法的遞迴非遞迴演算法。這篇換了一種新的建立方法,用先根遍歷遞迴的思路建立二叉樹,用遞迴的方法計算深度,用中根遞迴和非遞迴方法遍歷整個二叉樹。 BinaryTree.h //二叉樹的建立和遍歷 #ifndef BINARYTREE_

Java 實現插入

定義節點類 package com.drj.tree; /** * * @ClassName: TreeNode * @Description:TODO(代表樹節點) * @author: drj * @date: 2018年8月22日

七:重建(依據先序(或者後序中序重建

off 相同 tree int roo 節點 先序 throw -a 對於一顆二叉樹。能夠依據先序遍歷(或者後序遍歷)和中序遍歷(樹中不含反復的數字)又一次還原出二叉樹。 解析: 1. 先序遍歷序列的第一個元素必然是根節點,能夠由此獲取二叉樹的根節點。 2. 依

建立

mil inorder 推斷 microsoft con 是否 font pac node 二叉樹創建遍歷規則: 1.先序:根-左-右 2.中序:左-根-右 3.後序:左-右-根 二叉樹定義和輔助函數例如以下: struct node {

7-5 還原 (25 分)(,根據 中序 先序

7-5 還原二叉樹 (25 分) 給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。 輸入格式: 輸入首先給出正整數N(≤50),為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為N的不包含重複英文字母(區別大小寫)的字串。 輸出格式:

C++實現建立、前序、中序、後序、層序

看完資料結構二叉樹部分後,通過學習書上的虛擬碼以及其他人的程式碼自己動手實現了一下,採用前序方式建立一顆二叉樹,實現了前中後層四種遍歷方式。 在層序遍歷部分與前三種遍歷不同,層序遍歷採用從根節點開始從上到下逐層遍歷,所以藉助佇列來實現,開始遍歷後,將根節點先壓入佇列,然後將

Java構建及深度優先廣度優先

1.工程目錄如下: 2.定義節點資訊的類:TreeNode.java package binarytree; public class TreeNode{ public TreeNode() { // TODO Auto-generated construct