C語言強化(一)二叉排序樹轉成排序的雙向鏈表,二叉排序
幾乎每一位碼士的編程起點都是C,在玩過了Java、C#、PHP、Python之後,重回C語言,又是什麼樣的一種感覺呢?
此篇博文作為 【C語言強化】系列文章的第一篇,來聊聊曾讓許多碼士抓耳撓腮的二叉樹。
通過這道題,你可以掌握
- 如何建立二叉樹
- 如何遍曆二叉樹
- 如何建立二叉鏈表
- 怎樣使用遞迴演算法
這是一道非常老土但又十分經典的資料結構題,或許很多人會說自己之前已經做過了,但又有多少人回過頭來做的時候,可以不藉助任何參考資料把解題思路寫出來?
題目要求:二叉排序樹->雙向鏈表排序
不能新增結點,只能修改指標指向
思路
1.定義二叉樹結構體
2.二叉樹建構函式,作用:指定要插入的值和二叉樹的根結點,可以自動插入到二叉排序樹
3.中序遍曆二叉樹的同時向雙向鏈表插入結點並列印
原始碼
#include <stdio.h>#include<stdlib.h>#include <iostream>using namespace std;/**二叉排序樹->雙向鏈表排序不能新增結點,只能修改指標指向思路1.建立二叉樹結構體2.二叉樹建構函式3.中序遍曆二叉樹的同時向雙向鏈表插入結點並列印*///建立二叉樹結構體struct BTreeNode{int value;BTreeNode *leftNode;BTreeNode *rightNode;};typedef BTreeNode Btn;BTreeNode *dListIndex;//雙向鏈表的索引,指向當前鏈表的尾巴BTreeNode *dListHead;//雙向鏈表的頭/*二叉樹建構函式按照二叉排序的演算法插入(左小右大)node二叉樹的根結點value要插入的結點的值 */void insertToBTree(BTreeNode * &node,int value){//結點為空白,插入結點為根結點if(NULL==node){BTreeNode * btNode=new BTreeNode();btNode->value=value;btNode->leftNode=NULL;btNode->leftNode=NULL;node=btNode;}else{//結點非空//值小於根結點,遞迴左結點if((node->value)>value)insertToBTree(node->leftNode,value);//值大於根結點,遞迴右結點else if(value>(node->value))insertToBTree(node->rightNode,value);//值與已有結點值相等,提示錯誤elseprintf("結點已經存在,不可以再次插入!");}}/*雙向鏈表建構函式btNode要插入的結點*/void insertToDoubleList(Btn * btNode){//要插入的結點的左指標指向雙向鏈表尾巴btNode->leftNode=dListIndex;//如果雙向鏈表非空,雙向鏈表尾巴右邊指向要插入的結點,完成雙向連結if(NULL!=dListIndex)dListIndex->rightNode=btNode;//雙向鏈表為空白,頭結點為要插入結點elsedListHead=btNode;//索引結點永遠指向插入的結點dListIndex=btNode;//輸出值cout<<btNode->value<<endl;}/*中序遍曆二叉排序樹,同時往雙向鏈表插入值btNode 二叉樹根結點*/void goThroughBTree(Btn * btNode){//結點為空白,返回if(NULL==btNode)return;//左結點不為空白,繼續向左深入else if(NULL!=btNode->leftNode)goThroughBTree(btNode->leftNode);//直到左結點為空白,插入insertToDoubleList(btNode);//右不為空白,向右深入if(NULL!=btNode->rightNode){goThroughBTree(btNode->rightNode);}}void main(){BTreeNode *root=NULL;//二叉樹根結點dListIndex=NULL;dListHead=NULL;//建立二叉排序樹insertToBTree(root,10);insertToBTree(root,6);insertToBTree(root,12);insertToBTree(root,14);insertToBTree(root,8);insertToBTree(root,4);insertToBTree(root,16);//遍曆二叉樹goThroughBTree(root);system("pause");}
這道題十分基礎,基礎到幾乎每個程式員都見過,但有多少人能夠真的理解二叉樹的概念而不藉助任何參考把它做出來呢?這也是它會是微軟的面試題的原因。