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;
}

結果:

相關推薦

實現建立映象

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

建立(類)

程式碼: #include<iostream> #include<queue> using namespace std; //建立節點 struct Tnode { char data;//資料域 Tnode *rchild;//右孩子 Tno

C++ 建立

#include<iostream> using namespace std; struct bitNode { char data; bitNode *lchild, *rchild

leetcode 783. 搜尋結點最小距離(實現java)

題目描述: 給定一個二叉搜尋樹的根結點 root, 返回樹中任意兩節點的差的最小值。 示例: 輸入: root = [4,2,6,1,3,null,null] 輸出: 1 解釋: 注意,root是樹結點物件(TreeNode object),而不是陣列。 給定的樹 [4,

的前序中序後序。用實現

#include<iostream> #include<stack> using namespace std; #define MAX 100 typedef struct Tree{ int data; Tree*lchild; Tree*rchild; }

中葉子結點的個數(的方式實現

思路: (1)通過先序遍歷的方式求解 (2)葉子節點的特點: 左右孩子都為空 可以用非遞迴的方式 也可以用遞迴方式  package com.zhaochao.tree; import java.util.Stack; /** * Created by z

實現

這裡寫自定義目錄標題 歡迎使用Markdown編輯器 新的改變 功能快捷鍵 合理的建立標題,有助於目錄的生成 如何改變文字的樣式 插入連結與圖片 如何插入一段漂亮的程式碼片 生成一個適合你的列表 建

的先序()、中序()、後序()層次java實現

二叉樹的先序遍歷,遞迴實現: public List<Integer> preorderTraversal(TreeNode root) { //用棧來實現 List<Integer> list = new ArrayList&l

中序)演算法C語言實現

二叉樹中序遍歷的實現思想是: 訪問當前節點的左子樹; 訪問根節點; 訪問當前節點的右子樹; 圖 1 二叉樹   以圖  1 為例,採用中序遍歷的思想遍歷該二叉樹的過程為: 訪問該二叉樹的根節點,找到 1; 遍歷節點 1 的左子樹,找到節點 2; 遍歷節點 2 的左子樹,找到節點 4;

3.1分別用方式實現先序、中序後序

題目 用遞迴和非遞迴方式,分別按照二叉樹先序、中序和後序列印所有的節點。 首先給出二叉樹節點結構定義: public class BinaryTreeNode { //二叉樹節點 private int data; private Bi

JAVA實驗:編碼實現一個類對輸入陣列的數從小到大排序同時使用二分法查詢某一個數(

編碼實現一個類 (1)提供一個靜態方法,可以將輸入的一個int[]陣列按照從小到大的順序排列; (2)提供靜態方法,對排好序的陣列使用折半(二分)查詢(使用遞迴和非遞迴兩種形式分別實現)查詢某一個整數。 答案 import java.util.*; public class

的建樹、(先序、中序、後序、層次)()--Java實現

什麼是樹?什麼是二叉樹? 樹:除了根節點之外的所有節點都有且只有一個父節點,根節點沒有父節點;除了葉結點以外的所有節點,都有一個或多個子節點,葉結點沒有子節點。 二叉樹:是樹的一種特殊結構,在二叉樹中,每個節點最多隻能有兩個子

的深度()---java實現

遞迴實現 為了求樹的深度,可以先求其左子樹的深度和右子樹的深度,可以用遞迴實現,遞迴的出口就是節點為空。返回值為0; 非遞迴實現 利用層次遍歷的演算法,設定變數level記錄當前節點所在的層數,設定變數last指向當前層的最後一個節點,當處理完當前層的最後一個節點,讓lev

深度 -- 實現

/*求二叉樹深度 -- 採用遞迴和非遞迴方法 **經除錯可執行原始碼及分析如下: */ #include <stdio.h> #include <stdlib.h> #inclu

實現計算葉子節點的個數

#include<stdio.h> #include<stdlib.h> #include <malloc.h> #include <stack> #define MAXSIZE 50 typedef struct Bin

搜尋(Binary Search Tree)的程式碼實現(C++)

二叉搜尋樹簡單介紹 二叉搜尋樹(Binary Search Tree)是滿足: 左子樹的根節點比樹的根節點小 右子樹的根節點比樹的根節點大 的二叉樹。 由於這種資料結構具有很高的查詢效率,故多用於需要索引的場合。 二叉搜尋樹的搜尋過程可以理解成類二

java實現

現有一顆如下圖所示的二叉樹: 其遍歷的各種方式如下: 構造一顆如下圖所示的二叉樹,用java實現其前序,中序,後序遍歷 注意二叉樹節點的定義如下: public clas

java實現深度

一.遞迴實現,深度優先遍歷二叉樹 public int dfs(TreeNode root){ if(null==root){ return 0;

實現建立三種

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

一列數字的規則如下;112358132134........ 求第30位數字是多少兩種方法演算法實現

斐波納契數列(Fibonacci Sequence),又稱黃金分割數列。在數學上,斐波納契數列以如下被以遞迴的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,現在我從演算法的角度,利用遞迴和非