在实际应用中,很多场合会涉及到数据结构中的树,二叉树作为最简单的树,则有很多重要的用处。而二叉树又细分为好多类型,在此只说二叉排序树,这种类型的树有个比较好的特性就是,中序遍历这棵树,你将得到一个按升序排列的数组。下面以一维数组来创建一棵二叉排序树。
#include "stdafx.h" #include <iostream> #include <vector> using namespace std; typedef struct Tree { int Data; struct Tree *LeftTree;//左子树 struct Tree *RightTree;//右子树 }TreeNode, *TreeNodeP; void InsertNode(TreeNodeP &TreeRoot, int Data) { //新建一个节点 TreeNodeP NodeP; NodeP = (TreeNodeP)malloc(sizeof(TreeNode)); NodeP->Data = Data; NodeP->LeftTree = NodeP->RightTree = NULL; //如果树根还没创建,那就把当前新建的节点赋给根吧 if (TreeRoot == NULL) { TreeRoot = NodeP; } //新插入的节点数值比根的小或等,走根的左边 else if (Data <= TreeRoot->Data) { //左子树递归结束处 if (TreeRoot->LeftTree == NULL) TreeRoot->LeftTree = NodeP; //左递归 else InsertNode(TreeRoot->LeftTree, Data); } //新插入的节点数值比根的大,走根的右边 else if (Data > TreeRoot->Data) { //右子树递归结束处 if (TreeRoot->RightTree == NULL) TreeRoot->RightTree = NodeP; //右递归 else InsertNode(TreeRoot->RightTree, Data); } } void TraveseTreeNode(TreeNodeP TreeRoot, int Mode) { if (TreeRoot) { //先序遍历 if (Mode == 1) { printf("NodeData=%d\n", TreeRoot->Data); TraveseTreeNode(TreeRoot->LeftTree, Mode); TraveseTreeNode(TreeRoot->RightTree, Mode); } //中序遍历 else if (Mode == 2) { TraveseTreeNode(TreeRoot->LeftTree, Mode); printf("NodeData=%d\n", TreeRoot->Data); TraveseTreeNode(TreeRoot->RightTree, Mode); } //后序遍历 else if (Mode == 3) { TraveseTreeNode(TreeRoot->LeftTree, Mode); TraveseTreeNode(TreeRoot->RightTree, Mode); printf("NodeData=%d\n", TreeRoot->Data); } } } int main() { TreeNodeP Tree = NULL; int A[11] = { 1, 6, 18, 3, 7, 17, 20, 2, 4, 13, 9 }; for (int i = 0; i < 11; i++) { InsertNode(Tree, A[i]); } TraveseTreeNode(Tree, 2); return 0; }运行程序,将得到:1 2 3 4 6 7 9 13 17 18 20 。不过二叉排序树有个不好的方面是,每个节点上左右树的深度可能差别比较大,比如有个数组为 1 2 3 4 6 7 9 13 17 18 20,它的树就是1→ 2 →3→4→ 6→→9→13→17→18→20
这棵树根本没左子树啥事。即节点上的左右子树的深度失衡,这个问题将由平衡二叉树来解决。后面有时间写一下。