設計一個算法,讀入一整串整數構成一棵二叉排序樹並進行查找。
測試數據:60 35 69 84 96 13 66 34 21 0
輸出:13 21 34 35 60 66 69 84 96
輸入查找數據:40
輸出:13 21 34 35 60 66 69 84 96
算法思想:二叉排序樹的構成,從空的二叉樹開始,每次輸入一個結點數據,就建立一個新結點插入到當前已生成的二叉排序樹中,所以它的主要操作是二叉排序樹的插入運算。在二叉排序樹插入新的結點,只要保證插入后仍符合二叉排序樹的定義即可。二叉排序樹的查找過程:當二叉排序樹非空時,首先將給定值與根結點比較,若相等,則查找成功,若小於根結點,則在左子樹繼續查找,若大於根結點的值,則在右子樹上繼續查找。
代碼:
(1)中序遍歷二叉樹算法 inorder (2)二叉排序樹的插入算法 inserbst (3)生成二叉排序樹算法 creatord (4)主函數
#include <iostream> #include <stdio.h> #include<malloc.h> using namespace std; typedef struct node { int key; struct node *lchild, *rchild; }bstnode; void inorder(bstnode *t) { if(t!=NULL) { inorder(t->lchild); printf("%4d",t->key); inorder(t->rchild); }//中序查找 } bstnode * insertbst(bstnode *t,int k) { bstnode *p; if(t==NULL) { p=(bstnode *)malloc(sizeof(bstnode)); p->key=k; p->lchild=NULL; p->rchild=NULL; return (p); } else if(t->key==k) return(t); else if(t->key>k){t->lchild=insertbst(t->lchild,k);return (t);} else{t->rchild=insertbst(t->rchild,k);return(t);} } bstnode *creatord(){ bstnode *t; int key; t=NULL; scanf("%d",&key); while(key!=0) { t=insertbst(t,key); scanf("%d",&key);} return (t); } int main() { //cout << "Hello world!" << endl; int key; bstnode * root; root=creatord(); inorder(root); printf("\n input search key:"); scanf("%d",&key); insertbst(root,key); inorder(root); printf("\n"); return 0; }
malloc函數為動態分配空間;
原型為: void * malloc(int size);
使用方法一般為:
假設你定義了一個名為Node的struct類型,你要定義一個名為a的Node類型的指針變量,使用以下語句:
Node * a=(Node *)malloc(sizeof(Node));
其中(Node *)為強制轉換,把返回類型void *轉換為Node *,sizeof(Node)為獲取Node類型占據空間的大小,如在我機子上int類型占4字節,sizeof(int)就返回4;
使用malloc需要包含#include <malloc.h>