#include <stdio.h>
#include <stdlib.h>
#define bool int
#define false 0
#define true 1
struct Node
{
struct Node* leftNode;
struct Node* rightNode;
int nNum;
};
//struct BinaryTree play as root node
struct BinaryTree
{
struct Node* leftNode;
struct Node* rightNode;
int nNum;
};
struct BinaryTree* createBinaryTree(int nNum)
{
struct BinaryTree* ptrTree = (struct BinaryTree*)malloc(sizeof(struct BinaryTree));
if (ptrTree == NULL)
return NULL;
ptrTree->leftNode = NULL;
ptrTree->rightNode = NULL;
ptrTree->nNum = nNum;
return ptrTree;
}
bool addEleToTree(struct BinaryTree* ptrTree, int nNum)
{
bool bRet = false;
if (ptrTree == NULL)
return bRet;
int nDirection = 0;
struct Node* curNode = NULL;
struct Node* curNodeBackup = NULL;
if (nNum < ptrTree->nNum)
{
curNode = ptrTree->leftNode;
nDirection = 1;//mark move record
curNodeBackup = ptrTree->leftNode;
}
else if (nNum > ptrTree->nNum)
{
curNode = ptrTree->rightNode;
nDirection = 2;//mark move record
curNodeBackup = ptrTree->rightNode;
}
else
{
return bRet;
}
while (true)
{
if (curNode == NULL)
{
struct Node* ptrNode = (struct Node*)malloc(sizeof(struct Node));
if (ptrNode == NULL)
break;
ptrNode->leftNode = NULL;
ptrNode->rightNode = NULL;
ptrNode->nNum = nNum;
if (curNodeBackup == NULL)
{
if (nDirection == 1)
{
ptrTree->leftNode = ptrNode;//just root node exist, let new node to 1st son node
}
else
{
ptrTree->rightNode = ptrNode;
}
break;
}
if (nDirection == 1)
{
curNodeBackup->leftNode = ptrNode;
}
else
{
curNodeBackup->rightNode = ptrNode;
}
bRet = true;
break;//finish job
}
curNodeBackup = curNode;//save curent node's postion
if (curNode->nNum > nNum)
{//move go left
curNode = curNode->leftNode;
nDirection = 1;
}
else if (curNode->nNum < nNum)
{//move go right
curNode = curNode->rightNode;
nDirection = 2;
}
else//when equal, fail for adding node, jump out of while loop
{
break;
}
}//end while
return bRet;
}
void ascendingTraversalTree(struct BinaryTree* ptrTree)
{
if (ptrTree->leftNode != NULL)
{//exist leftNode step in
ascendingTraversalTree((struct BinaryTree*)ptrTree->leftNode);
}
printf("%d\n", ptrTree->nNum);
if (ptrTree->rightNode != NULL)
{
ascendingTraversalTree((struct BinaryTree*)ptrTree->rightNode);
}
}
void descendingTraversalTree(struct BinaryTree* ptrTree)
{
if (ptrTree->rightNode != NULL)
{//exist leftNode step in
descendingTraversalTree((struct BinaryTree*)ptrTree->rightNode);
}
printf("%d\n", ptrTree->nNum);
if (ptrTree->leftNode != NULL)
{
descendingTraversalTree((struct BinaryTree*)ptrTree->leftNode);
}
}
//use Mid-order traversal
struct Node* findEleInTree(struct BinaryTree* ptrTree, int nKey)
{
if (ptrTree == NULL)
return NULL;
if (ptrTree->nNum == nKey)
{
return (struct Node*)ptrTree;
}
if (ptrTree->leftNode != NULL)
{
return findEleInTree(ptrTree->leftNode, nKey);
}
if (ptrTree->rightNode != NULL)
{
return findEleInTree(ptrTree->rightNode, nKey);
}
return NULL;
}
void main()
{
struct BinaryTree* ptrTree = createBinaryTree(10);
addEleToTree(ptrTree, 9);
addEleToTree(ptrTree, 15);
addEleToTree(ptrTree, 7);
addEleToTree(ptrTree, 8);
addEleToTree(ptrTree, 19);
addEleToTree(ptrTree, 12);
ascendingTraversalTree(ptrTree);
printf("descending sort\n");
descendingTraversalTree(ptrTree);
printf("find 8 in tree, shoule be true\n");
struct Node* ptrFind1 = findEleInTree(ptrTree, 8);
printf("find 8 node's address=%p\n", ptrFind1);
printf("find 20 in tree, shoule be false\n");
struct Node* ptrFind2 = findEleInTree(ptrTree, 20);
printf("find 20 node's address=%p\n", ptrFind2);
return;
}
C语言 二叉树 BinaryTree
点赞
收藏