C語言指標實現簡單二叉排序樹
阿新 • • 發佈:2019-02-04
二叉排序樹排序規則: 左節點 <= 根節點 <= 右節點
樹節點:
typedef struct _node
{
int data;
struct _node *leftChild;
struct _node *rightChild;
}TreeNode;
操作:
//按照儲存規則插入節點
void insertNode(TreeNode **root, int data)
{
TreeNode *node = (TreeNode *) malloc(sizeof(TreeNode));
node->data = data;
node-> leftChild = NULL;
node->rightChild = NULL;
//1.樹為空
//2.樹不為空
if (*root == NULL)
{
*root = node;
}
else
{
TreeNode *current = *root;
while (1)
{
if (current->data >= data)
{
if (current->leftChild == NULL)
{
current->leftChild = node;
break;
}
else current = current->leftChild;
}
else
{
if (current->rightChild == NULL)
{
current-> rightChild = node;
break;
}
else current = current->rightChild;
}
}
}
}
//中序遍歷:左->根->右,按照從小到大順序輸出樹
void inOrder(TreeNode *node)
{
if(node != NULL)
{
inOrder(node->leftChild);
printf("%d ",node->data);
inOrder(node->rightChild);
}
}
void endl()
{
printf("\n");
}
//按照後序遍歷(PostOrder)(左->右->根)的順序釋放節點記憶體
void freeAll(TreeNode *node)
{
if(node->leftChild != NULL) freeAll(node->leftChild);
if(node->rightChild != NULL) freeAll(node->rightChild);
free(node);
}
int main()
{
TreeNode *rootNode = NULL;
insertNode(&rootNode, 1);
insertNode(&rootNode, 2);
insertNode(&rootNode, 3);
insertNode(&rootNode, 2);
insertNode(&rootNode, 3);
insertNode(&rootNode, 98);
insertNode(&rootNode, 13);
inOrder(rootNode);
endl();
insertNode(&rootNode, 6);
insertNode(&rootNode, 13);
insertNode(&rootNode, 6);
insertNode(&rootNode, 54);
insertNode(&rootNode, 44);
inOrder(rootNode);
endl();
freeAll(rootNode);
return 0;
}
小結:由於二叉排序樹的規則,插入的節點保證嚴格有序,節點查詢的時間複雜度在O(Log2N)~O(N)之間,故整體排序的時間複雜度在O(NLog2N)~O(N^2)之間