具体实现代码如下:
BSTree.h具体内容:
- #ifndef _BSTREE_H_
- #define _BSTREE_H_
- typedef struct _tagBSTreeNode
- {
- int m_nVal;
- _tagBSTreeNode * m_pLeft;
- _tagBSTreeNode * m_pRight;
- }BSTreeNode;
- extern BSTreeNode * pHead;
- //追加树结点
- int AppendNode(BSTreeNode **, int nNum);
- //打印树结点
- void PrintTree(BSTreeNode ** ppTree);
- //释放树
- void Clear(BSTreeNode ** ppTree);
- //转换为有序双链表
- void InOrderTree(BSTreeNode ** ppTree);
- //销毁链表
- void ClearList(BSTreeNode * pHead);
- //打印链表
- void PrintList(BSTreeNode * pHead);
- //打印路径
- void PrintPath(BSTreeNode * pHead, int nSum);
- //打印和路径
- void PrintSumPath(BSTreeNode ** ppTree, int nLayer, int nPathSum);
- #endif
BSTree.cpp的内容:
- #include <stdlib.h>
- #include <stdio.h>
- #include "BSTree.h"
- //追加树结点
- int AppendNode(BSTreeNode ** ppTree, int nNum)
- {
- BSTreeNode * pNewNode = NULL;
- if (!ppTree)
- return 0;
- if (*ppTree == NULL)
- {
- pNewNode = (BSTreeNode *)malloc(sizeof(BSTreeNode));
- if (!pNewNode)
- return 0;
- pNewNode->m_nVal = nNum;
- pNewNode->m_pLeft = NULL;
- pNewNode->m_pRight = NULL;
- *ppTree = pNewNode;
- return 1;
- }
- if ((*ppTree)->m_nVal > nNum)
- {
- AppendNode(&((*ppTree)->m_pLeft), nNum);
- }
- else if ((*ppTree)->m_nVal < nNum)
- {
- AppendNode(&((*ppTree)->m_pRight), nNum);
- }
- else
- {
- printf("树结点已经存在.\n");
- return 0;
- }
- return 1;
- }
- //打印树结点
- void PrintTree(BSTreeNode ** ppTree)
- {
- if (!ppTree)
- return;
- if (*ppTree == NULL)
- {
- return;
- }
- if ((*ppTree)->m_pLeft)
- PrintTree(&((*ppTree)->m_pLeft));
- if (*ppTree)
- printf("%d", (*ppTree)->m_nVal);
- if ((*ppTree)->m_pRight)
- PrintTree(&((*ppTree)->m_pRight));
- }
- //释放树
- void Clear(BSTreeNode ** ppTree)
- {
- BSTreeNode * pLeftTree = NULL;
- BSTreeNode * pRightTree = NULL;
- if (!ppTree)
- return;
- if (*ppTree == NULL)
- return;
- if ((*ppTree)->m_pLeft)
- {
- pLeftTree = (*ppTree)->m_pLeft;
- Clear(&pLeftTree);
- }
- if ((*ppTree)->m_pRight)
- {
- pRightTree = (*ppTree)->m_pRight;
- Clear(&pRightTree);
- }
- if (*ppTree)
- {
- free(*ppTree);
- *ppTree = NULL;
- }
- return;
- }
- //以左孩子为前驱
- //以右孩子为后继
- BSTreeNode * pHead = NULL;
- void AppendNode2List(BSTreeNode * pInput)
- {
- BSTreeNode * pCurNode = NULL;
- if (pInput == NULL)
- return;
- if (!pHead)
- {
- pHead = pInput;
- pInput->m_pLeft = NULL;
- pInput->m_pRight = NULL;
- return;
- }
- pCurNode = pHead;
- while (pCurNode->m_pRight)
- {
- pCurNode = pCurNode->m_pRight;
- }
- pCurNode->m_pRight = pInput;
- pInput->m_pLeft = pCurNode;
- pInput->m_pRight = NULL;
- return ;
- }
- //打印树结点
- void InOrderTree(BSTreeNode ** ppTree)
- {
- if (!ppTree)
- return;
- if (*ppTree == NULL)
- {
- return;
- }
- if ((*ppTree)->m_pLeft)
- InOrderTree(&((*ppTree)->m_pLeft));
- if (*ppTree)
- AppendNode2List(*ppTree);
- if ((*ppTree)->m_pRight)
- InOrderTree(&((*ppTree)->m_pRight));
- }
- void PrintList(BSTreeNode * pHead)
- {
- BSTreeNode * pCurNode = NULL;
- if (!pHead)
- return;
- pCurNode = pHead;
- printf("\n链表数据:\n");
- while (pCurNode)
- {
- printf("%d ", pCurNode->m_nVal);
- pCurNode = pCurNode->m_pRight;
- }
- return;
- }
- void ClearList(BSTreeNode * pHead)
- {
- BSTreeNode * pCurNode = NULL;
- if (!pHead)
- return;
- while (pHead)
- {
- pCurNode = pHead->m_pRight;
- free(pHead);
- pHead = pCurNode;
- }
- return;
- }
- //打印和路径
- void PrintSumPath(BSTreeNode ** ppTree, int nLayer, int nPathSum)
- {
- static int Sum[256] = { 0 };
- int nSum = 0;
- int i = 0;
- if (!ppTree)
- return;
- if (*ppTree == NULL)
- {
- return;
- }
- if (*ppTree)
- {
- Sum[nLayer] = (*ppTree)->m_nVal;
- }
- if ((*ppTree)->m_pLeft)
- PrintSumPath(&((*ppTree)->m_pLeft), nLayer + 1, nPathSum);
- if ((*ppTree)->m_pRight)
- PrintSumPath(&((*ppTree)->m_pRight), nLayer + 1, nPathSum);
- if (((*ppTree)->m_pLeft==NULL) && ((*ppTree)->m_pRight == NULL))
- {
- for (i = 0; i <= nLayer; i++)
- {
- nSum += Sum[i];
- }
- if (nSum == nPathSum)
- {
- printf("路径:\n");
- for (i = 0; i <= nLayer; i++)
- {
- printf("%d ", Sum[i]);
- }
- printf("\n");
- }
- }
- return;
- }
- #define _CRTDBG_MAP_ALLOC
- #include <stdlib.h>
- #include <stdio.h>
- #include <crtdbg.h>
- #include "BSTree.h"
- void main()
- {
- BSTreeNode * pTree = NULL;
- if (AppendNode(&pTree, 10) == NULL)
- {
- printf("追加失败.\n");
- return;
- }
- if (AppendNode(&pTree, 5) == NULL)
- {
- printf("追加失败.\n");
- return;
- }
- if (AppendNode(&pTree, 12) == NULL)
- {
- printf("追加失败.\n");
- return;
- }
- if (AppendNode(&pTree, 4) == NULL)
- {
- printf("追加失败.\n");
- return;
- }
- if (AppendNode(&pTree, 7) == NULL)
- {
- printf("追加失败.\n");
- return;
- }
- PrintTree(&pTree);
- PrintSumPath(&pTree, 0,22); //找出和为22的值
- Clear(&pTree);
- _CrtDumpMemoryLeaks();
- system("pause");
- return;
- }
图1 运行效果