今天在回寢室的路上同學跟我討論往二叉排序樹中插入新的節點,我一想這不很簡單嗎,回到寢室立馬寫了個程式讓他看,他一看說我要的是遞迴的方法。我一想遞迴的話,每次調用函數不都插入了一個新節點,那不建立成一顆二叉排序樹了嗎,不是插入一個節點。我又看了一下非遞迴的方法,發現當根為空白時直接將建立的節點p賦給根節點t,這主要用到了引用賦值的原理,對,我可以利用引用的原理。(1)當根為空白時,直接將根 t 賦值為建立的節點指標返回 (2) 當根節點的值大於要插入節點的值時,遞迴的將建立的節點插入到根節點的左子樹的合適位置
(3)否則,遞迴的將建立的節點插入到根節點的右子樹的合適位置 。
具體代碼如下:
// 二叉樹的建立.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include <iostream>using namespace std;//定義二叉排序樹的節點typedef struct Node{ int data; struct Node * lchild;//左孩子 struct Node * rchild;//右孩子}Node,* PNode;PNode T=NULL;//二叉排序樹的根節點//中序遍曆二叉樹void MidSequence(PNode t){ if(t!=NULL) { MidSequence(t->lchild); cout<<t->data<<" "; MidSequence(t->rchild); }}//往二叉排序樹中插入一個新節點(非遞迴實現)void CreateBSortTree(PNode & t,int data){ //建立一個新節點 PNode p=(PNode)malloc(sizeof(Node)); p->data=data; p->lchild=NULL; p->rchild=NULL; if(t==NULL) { t=p; return; } PNode q=t,parent; do{ parent=q; if(parent->data>data)q=parent->lchild;elseq=parent->rchild; }while(q!=NULL); if(parent->data>data) parent->lchild=p; else parent->rchild=p;}//往二叉排序樹中插入一個新節點(遞迴實現)void CreateBSortTree2(PNode & t,int data){ if(t==NULL) { //建立一個新節點 PNode p=(PNode)malloc(sizeof(Node)); p->data=data; p->lchild=NULL; p->rchild=NULL; t=p; return; } else if(t->data>data) CreateBSortTree2(t->lchild,data); else CreateBSortTree2(t->rchild,data);}//測試int _tmain(int argc, _TCHAR* argv[]){int a[]={0,5,8,4,2,3,10};int len=sizeof(a)/sizeof(int);for(int i=0;i<len;i++){ CreateBSortTree2(T,a[i]);} MidSequence(T);system("PAUSE");return 0;}