首页 > 代码库 > 【剑指offer】二叉树中和为某一值的路径

【剑指offer】二叉树中和为某一值的路径

节点形态:


实现:

/******************************************
二叉树的二叉链表存储
by Rowandjj
2014/5/18
******************************************/
#include<IOSTREAM>
using namespace std;

/*二叉树的二叉链表存储表示*/
typedef int TElemType;
typedef struct _TREENODE_
{
    TElemType data;//值
    struct _TREENODE_ *lChild;//左孩子
    struct _TREENODE_ *rChild;//右孩子
}TreeNode,*pTreeNode,**ppTreeNode;
/*--------------辅助队列-------------------*/
typedef struct _QUEUE_NODE_//队列节点定义
{
    pTreeNode data;//数据域(存储二叉树节点)
    struct _QUEUE_NODE_ *pNext;//指针域
}QueueNode,*pQueueNode;

typedef struct _QUEUE_
{
    pQueueNode pHead;//队列头指针
    pQueueNode pTail;//队列尾指针
    int nodeCount;//队列节点个数
}Queue,*pQueue;
/*队列基本操作*/
void InitQueue(pQueue pQueueTemp);
void EnQueue(pQueue pQueueTemp,pTreeNode pTreeNodeTemp);
bool DeQueue(pQueue pQueueTemp,ppTreeNode ppTreeNodeTemp);
bool IsQueueEmpty(Queue QueueTemp);
void DestroyQueue(pQueue pQueueTemp);
//-----------------------------------------------------------------------
/*二叉树基本操作*/
void InitTree(ppTreeNode ppTreeNodeTemp);
void CreateTree(ppTreeNode ppTreeNodeTemp);
void DestroyTree(ppTreeNode ppTreeNodeTemp);
bool IsEmpty(pTreeNode pTreeNodeTemp);
void PreTravel(pTreeNode pTreeNodeTemp);//先序遍历
void MidTravel(pTreeNode pTreeNodeTemp);//中序遍历
void PosTravel(pTreeNode pTreeNodeTemp);//后序遍历
void LevelTravel(pTreeNode pTreeNodeTemp);//层次遍历
int GetDepth(pTreeNode pTreeNodeTemp);//求二叉树深度
void FindNode(pTreeNode pTreeNodeTemp,int data,ppTreeNode pFind);//查找节点,如果成功则用pFind返回
void Assign(pTreeNode pTreeNodeTemp,TElemType data);//赋值
void GetRoot(pTreeNode pTreeNodeTemp,void (*print)(TElemType));//获取根节点
pTreeNode GetParent(pTreeNode pTreeNodeTemp,TElemType data);//获取父节点
pTreeNode GetPoint(pTreeNode pTreeNodeTemp,TElemType data);//返回指向元素值为data的节点的指针
pTreeNode GetLeftChild(pTreeNode pTreeNodeTemp,TElemType data);//获取元素值为data的左孩子
pTreeNode GetRightChild(pTreeNode pTreeNodeTemp,TElemType data);//获取元素值为data的右孩子
pTreeNode GetLeftSibling(pTreeNode pTreeNodeTemp,TElemType data);//获取元素值为data的左兄弟
pTreeNode GetRightSibling(pTreeNode pTreeNodeTemp,TElemType data);//获取元素值为data的右兄弟
bool InsertChild(pTreeNode pTreeNodeTemp,int flag,pTreeNode pTreeNew);//将pTreeNew整体插到pTreeNodeTemp中,约定pTreeNew右子树为空,根据标志位flag的0或者1来判断插入位置
bool DeleteChild(pTreeNode pTreeNodeTemp,int flag);//flag==0,删除左子树,否则删除右子树

void printNode(TElemType e);

//-------------队列基本操作实现----------------------------------
void InitQueue(pQueue pQueueTemp)
{
    pQueueTemp->pHead = pQueueTemp->pTail = (pQueueNode)malloc(sizeof(QueueNode));
    if(pQueueTemp->pHead == NULL)
    {
        return;
    }
    pQueueTemp->pHead->pNext = NULL;
    pQueueTemp->nodeCount = 0;
}

void EnQueue(pQueue pQueueTemp,pTreeNode pTreeNodeTemp)
{
    pQueueNode pNodeNew = (pQueueNode)malloc(sizeof(QueueNode));
    if(pNodeNew != NULL)
    {
        pNodeNew->data = http://www.mamicode.com/pTreeNodeTemp;>