二叉樹,前序,中序,後序遍歷的具體實現
除了二叉樹遍歷的程式碼,以下內容都來自百度百科。基礎好的話請省略。
二叉樹的定義:
圖論中是這樣定義二叉樹的:
二叉樹是
一個
連通的
無環
圖,
每一個頂點的度不大於3。
有根二叉樹還要滿足根結點的度不大於2。
有了根結點之後,每個頂點定義了唯一的父結點,和最多2個子結點。
然而,沒有足夠的資訊來區分左結點和右結點。
如果不考慮連通性,允許圖中有多個連通分量,這樣的結構叫做森林。
二叉樹的基本概念
二叉樹是遞迴定義的,其結點有左右子樹之分,邏輯上二叉樹有五種基本形態:
(1)空二叉樹——如圖(a);
(2)只有一個根結點的二叉樹——如圖(b);
(3)只有左子樹——如圖(c );
(4)只有右子樹——如圖(d);
(5)完全二叉樹——如圖(e)。
注意:儘管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。[1]
二叉樹型別【型別不止這些】
(1)完全二叉樹——若設二叉樹的高度為h,
除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,
第h層有葉子結點,
並且葉子結點都是從左到右依次排布,這就是完全二叉樹。
---------------------------------------------------------
(2)滿二叉樹——
除了葉結點外
每一個結點都有左右子葉
且葉子結點都處在最底層
的二叉樹。
--------------------------------------------------------
(3)平衡二叉樹——
平衡二叉樹又被稱為AVL樹(區別於AVL演算法),
它是一棵二叉排序樹,
且具有以下性質:
它是一棵空樹
或它的左右兩個子樹的高度差的絕對值不超過1,
並且左右兩個子樹都是一棵平衡二叉樹。
相關術語
樹的結點:包含一個數據元素及若干指向子樹的分支;
孩子結點:結點的子樹的根稱為該結點的孩子;
雙親結點:B 結點是A 結點的孩子,則A結點是B 結點的雙親;
兄弟結點:同一雙親的孩子結點; 堂兄結點:同一層上結點;
祖先結點: 從根到該結點的所經分支上的所有結點子孫結點:以某結點為根的子樹中任一結點都稱為該結點的子孫
結點層:根結點的層定義為1;根的孩子為第二層結點,依此類推;
樹的深度:樹中最大的結點層
結點的度:結點子樹的個數
樹的度: 樹中最大的結點度。
葉子結點:也叫終端結點,是度為 0 的結點;
分枝結點:度不為0的結點;
有序樹:子樹有序的樹,如:家族樹;
無序樹:不考慮子樹的順序;
二叉樹的性質
(1) 在非空二叉樹中,第i層的結點總數不超過 2的(i-1)方, i>=1;
(2) 深度為h的二叉樹最多有2的h次方-1個結點(h>=1),最少有h個結點;
(3) 對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,
則N0=N2+1;
(4) 具有n個結點的完全二叉樹的深度為log2 (n+1)
(5)有N個結點的完全二叉樹各結點如果用順序方式儲存,則結點之間有如下關係:
若I為結點編號則 如果I>1,則其父結點的編號為I/2;
如果2*I<=N,則其左兒子(即左子樹的根結點)的編號為2*I;若2*I>N,則無左兒子;
如果2*I+1<=N,則其右兒子的結點編號為2*I+1;若2*I+1>N,則無右兒子。
(6)給定N個節點,能構成h(N)種不同的二叉樹。
h(N)為卡特蘭數的第N項。h(n)=C(2*n,n)/(n+1)。
(7)設有i個枝點,I為所有枝點的道路長度總和,J為葉的道路長度總和J=I+2i
結點
class Node{
private int v;
private Node left;
private Node right;
public int getV() {
return v;
}
public void setV(int v) {
this.v = v;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
}
前序遍歷
先根節點,然後左子樹,右子樹
Java程式碼:
public void Preordertraversal(Node node){
int v = node.getV();
//遍歷當前結點
System.out.println(v);
Node left = node.getLeft();
//遍歷左子樹
if(left != null) Preordertraversal(left);
Node right = node.getRight();
//遍歷右子樹
if(right != null) Preordertraversal(right);
}
中序遍歷
先左子樹,再根節點,右子樹
public void Inordertraversal(Node node) {
int v = node.getV();
Node left = node.getLeft();
Node right = node.getRight();
//遍歷左子樹
if(left != null) Inordertraversal(left);
//遍歷根節點
System.out.println(v);
//遍歷右子樹
if(right != null) Inordertraversal(right);
}
後序遍歷
右子樹,根節點,左子樹
public void Postordertraversal(Node node) {
int v = node.getV();
Node left = node.getLeft();
Node right = node.getRight();
//遍歷右子樹
if(right != null) Postordertraversal(right);
//遍歷左子樹
if(left != null) Postordertraversal(left);
//遍歷根節點
System.out.println(v);
}
相關推薦
假設二叉樹中每個結點的值為單個字元, 設計一個演算法將一棵以二叉鏈方式儲存的二叉樹 b 轉換成對應的順序儲存結構 a。——含具體實現工程
假設二叉樹中每個結點的值為單個字元, 設計一個演算法將一棵以二叉鏈方式儲存的二叉樹 b 轉換成對應的順序儲存結構 a。——李春葆資料結構第五版第七章,P246,第十題 思路解析: 解:設二叉樹的順序儲存結構型別為SqBTree,先將順序儲存結構a中所有元素置為‘#’(表示空結點)。將b轉
二叉樹的建立與訪問演算法的設計(三種遍歷方法)
二叉樹的建立與訪問演算法的設計(三種遍歷方法) 1、【問題描述】 從鍵盤輸入二叉樹的元素,建立二叉樹,實現二叉樹的遍歷演算法。 【基本要求】 實現以下基本操作: (1)從鍵盤輸入二叉樹的元素,建立二叉樹。 (2)實現二叉樹的先序遍歷演算法。 2、【問題描述】 從鍵盤輸入二叉樹的元素,
二叉樹基本數學知識,建立及三種遞迴遍歷
一.基本知識 1. 數學知識 (1)在二叉樹的第i層上最多有2^(i-1)個節點 (2)深度為k的二叉樹最多有2^(k)-1 個節點 (3)對任意二叉樹,若葉子節點數為n0,度(
java實現二叉樹的Node節點定義,並手撕8種遍歷
最近準備秋招面試,發現二叉樹這種可以無限擴充套件知識點來虐別人的資料結構,很受面試官的青睞。 如果掌握的不好,會直接死在一面哦。 怕嗎?當你原理、思想,內部結構通通明白,分分鐘手撕程式碼的程度,還怕嗎? 本篇文章就從用java的思想和程式從最基本的怎麼將一個in
二叉樹的前序,中序遍歷
blog root tac ace bsp else 中序 ret clas 前序遞歸於循環 #include <iostream> #include <stack> using namespace std; struct TreeNode {
二叉樹的前序,中序,後序的遍歷的遞迴和非遞迴程式碼-C語言
#include <stdio.h> #include<stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input l
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹(java實現並測試)
假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 package ssp; class TreeNode { int val; TreeNod
二叉樹的前序,中序,後序遍歷。用遞迴和非遞迴實現
#include<iostream> #include<stack> using namespace std; #define MAX 100 typedef struct Tree{ int data; Tree*lchild; Tree*rchild; }
java遍歷二叉樹:前序遍歷,中序遍歷,後序遍歷,遍歷深度,求葉子節點個數,層次遍歷
import java.util.ArrayDeque; import java.util.Queue; public class CreateTree { /** * @param args */ public static void main(Stri
二叉樹輸入前序遍歷,中序遍歷重建二叉樹並返回
function reConstructBinaryTree(pre, vin) { if(pre.length===0||!pre){ return; }
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5
思路:前序遍歷的第一個元素就是根節點,在中序遍歷中找到根節點的位置,根節點前面的元素就二叉樹的左子樹,根節點後面的元素就是二叉樹中的右子樹,在找出左子樹和右子樹的前序遍歷和中序遍歷,然後遞迴呼叫,再找根節點和左子樹、右子樹 /** * Definition for bi
Java資料結構:二叉樹的前序,中序,後序遍歷(遞迴和非遞迴)
嚶嚶嚶,兩個月沒寫部落格了,由於有點忙,今天開始日更部落格。 今天總結一下學習樹的先根,中根,後根。每種兩種方法,遞迴和非遞迴。 先根: 遞迴: 思路:先根遍歷,即第一次遇到的結點就開始列印。先一直遍歷左子樹,直到未空,然後右子樹,直到為空。遞迴下去。 過程:先將1進入方法
二叉樹構造-前序輸入,後序,中序輸出
#include<iostream> #include<cstring> using namespace std; #define DataType char typedef struct Node { DataType data; struct Node*
二叉樹的前序,中序,後序,層次遍歷(遞迴與非遞迴方式)
以前在學校學過二叉樹的遍歷,工作後基本上沒用到,現在整理下這幾種排序演算法: 1.java的測試方法: package leetcode.TestList; /** * @author zhangyu * @version V1.0 * @ClassName: TreeNode *
已知二叉樹的前序遍歷和中序遍歷,如何得到它的後序遍歷?
對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是N,左節點是L,右節點是R,那麼對應的訪問遍歷順序如下: 前序遍歷 N->L->R中序遍歷 L->
計算機技術——已知二叉樹的前序遍歷和中序遍歷,如何得到它的後序遍歷?
對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是N,左節點是L,右節點是R,那麼對應的訪問遍歷順序如下:前序遍歷 N->L->R中序遍歷 L->N-&
已知二叉樹的前序和中序遍歷,構建該二叉樹
// 前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6} public TreeNode reConstructBinaryTree(int[] pre, int[] in) { if (pre == null || in == null
輸入某二叉樹的前序遍歷和中序遍歷的結果,重建該二叉樹
題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。 思路: 先序遍歷的第一個元素為根節點,在中序遍歷中找到這個根節點,從而可以將中序遍歷分為左右兩個部分,左邊部分為左子樹的中序遍歷,右
輸入某二叉樹的前序遍歷和中序遍歷的結果,重建此二叉樹。
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 比如我們知道一二叉
二叉樹的前序,中序,後續,遞迴及非遞迴遍歷的python實現
在計算機科學裡,樹的遍歷(也稱為樹的搜尋)是圖的遍歷的一種,指的是按照某種規則,不重複地訪問某種樹的所有節點的過程。具體的訪問操作可能是檢查節點的值、更新節點的值等。不同的遍歷方式,其訪問節點的順序是不一樣的。 遍歷的種類 遍歷方式的命名,源於其訪問節點