樹是一種比較重要的資料結構,尤其是二叉樹。二叉樹是一種特殊的樹,在二叉樹中每個節點最多有兩個子節點,一般稱為左子節點和右子節點(或左孩子和右孩子),並且二叉樹的子樹有左右之分,其次序不能任意顛倒。本篇部落格將詳細為大家解析二叉樹。
首先介紹兩個概念:
滿二叉樹:在一棵二叉樹中,如果所有分支結點都有左孩子和右孩子結點,並且葉子結點都集中在二叉樹的最下層,這樣的樹叫做滿二叉樹
如:
完全二叉樹:若二叉樹中最多只有最下面兩層的結點的度數可以小於2,並且最下面一層的葉子結點都是依次排列在該層最左邊的位置上,則稱為完全二叉樹
如:
區別:滿二叉樹是完全二叉樹的特例,因為滿二叉樹已經滿了,而完全並不代表滿。所以形態你也應該想象出來了吧,滿指的是出了葉子節點外每個節點都有兩個孩子,而完全的含義則是最後一層沒有滿,並沒有滿。
二叉樹的鏈式儲存結構是一類重要的資料結構,定義結果為:
//定義樹的結構
struct node
};
二叉樹的建立首先我們使用者輸入生成一棵二叉樹,要生的的二叉樹如下圖所示:
#代表空結點。
下面我們根據上面圖中所示的二叉樹,利用先序依次輸入abdg###e#h##c#f##(即先序遍歷)
生成二叉樹的**如下:
//二叉樹生成--先序遍歷輸入要生成的二叉樹資料,#代表空結點
void createtree(node * & root)
}
二叉樹節點查詢採用遞迴的方法在二叉樹root裡查詢只為aim的結點,若找到此節點則返回其指標,否則返回null
查詢**如下:
//檢查二叉樹是否包含資料aim,有則返回其指標
node * findnode(node * & root,string aim)
}
這裡解釋一下遞迴中的return的意思:
return 對當前函式來說是結束了,對呼叫它的父函式來說你這個函式執行完成了,父函式就會接著執行下一語句。
沒想到父函式馬上又遇到乙個return,父函式結束了,對爺爺函式來說父函式執行完成了,爺爺函式就接著執行下乙個語句
二叉樹遍歷
1.先序遍歷
先序遍歷過程是:
1)訪問根結點
2)先序遍歷左子樹
3)先序遍歷右子樹
先序遍歷**為:
void preorder(node * root)//先序遍歷
}
2.中序遍歷中序遍歷過程是:
1)中序遍歷左子樹
2)訪問根結點
3)中序遍歷右子樹
中序遍歷的**:
void inorder(node * root)//中序遍歷
}
3.後續遍歷後序遍歷過程是:
1)後序遍歷左子樹
2)後序遍歷右子樹
3)訪問根結點
後序遍歷**為:
void postorder(node * root)//後序遍歷
}
二叉樹高度計算遞迴解法:
(1)如果二叉樹為空,二叉樹的深度為0
(2)如果二叉樹不為空,二叉樹的深度 = max(左子樹深度, 右子樹深度) + 1
**如下:
int nodeheight(node * root)//計算二叉樹高度
}
輸出二叉樹葉子節點
void showleaf(node * root)
}
執行結果為:
遞迴分析
上面源**中,大量運用了遞迴演算法,
下面我們來分析其中乙個遞迴的過程。
二叉樹結構為:
利用先序遍歷,即**為:
void preorder(node * root)//先序遍歷
}
畫出其執行狀態圖:
二叉樹詳解
一 簡介 世界上的樹有千萬種,我們這裡來學習我們資料結構中的樹,它是我們現實生活中倒置的樹。之前,我們學習的順序表,鍊錶,棧 和佇列。可以說都是我們的線性結構,也就是我們所謂的一對一的結構,可是現實生活中,我們經常碰到是我們一對多的情況。今天,我們就來研究一下這種一對多的資料結構體 樹 那麼,什麼叫...
二叉樹詳解
一 二叉樹的一些概念 二叉樹就是每個結點最多有兩個子樹的樹形儲存結構。先上圖,方便後面分析。1 滿二叉樹和完全二叉樹 上圖就是典型的二叉樹,其中左邊的圖還叫做滿二叉樹,右邊是完全二叉樹。然後我們可以得出結論,滿二叉樹一定是完全二叉樹,但是反過來就不一定。滿二叉樹的定義是除了葉子結點,其它結點左右孩子...
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...