leetcode的Hot100系列--二叉樹建立和遍歷

不少題目涉及到二叉樹,因此先把二叉樹的一些基本的建立和遍歷寫一下,方便以後的本地代碼調試。
爲了方便,這裏使用的數據爲char類型數值,初始化數據使用一個數組。
由於這些東西比較簡單,這裏就不作過多詳述。node


建立

一、定義一些內容:數組

// 二叉樹節點結構體
typedef struct tree_node
{
    struct tree_node *pL;
    struct tree_node *pR;
    char data;
}TREE_NODE_S

// 輸入數據的無效值,若讀到無效值,則說明該節點爲空
#define INVALID -1

// 全局變量,記錄當前輸入的數組位置
char count = 0

// 在遍歷樹的時候,須要對data作的操做
typedef void (*pfprocData)(char *p);

二、使用遞歸方式建立原始二叉樹。
其基本思想與先序遍歷基本同樣,只不過一個是對數據作輸出,一個是對數據作輸入。函數

TREE_NODE_S* createNode(char *str)
{
    TREE_NODE_S *pTemp = NULL;
    char data = *(str+count);
    count ++;
    if (data != INVALID)
    {
        pTemp = (TREE_NODE_S *)calloc(1, sizeof(TREE_NODE_S));
        if (NULL == pTemp)
        {
            return pTemp;
        }
        pTemp->data = data;  
        pTemp->pL = createNode(str);
        pTemp->pR = createNode(str);
    }
    return pTemp;
}

三、這裏再提供一種無返回值、傳樹的二級指針的建立方法:測試

createNode2(TREE_NODE_S **p, char *str)
{
    TREE_NODE_S *pTemp = NULL;
    char data = *(str+count);
    count ++;
    if (data != INVALID)
    {
        pTemp = (TREE_NODE_S *)calloc(1, sizeof(TREE_NODE_S));
        if (NULL == pTemp)
        {
            *p = NULL;
            return;
        }
        // 這裏直接對指針進行賦值
        *p = pTemp;
        pTemp->data = data;  
        createNode2(&(pTemp->pL), str);
        createNode2(&(pTemp->pR), str);
    }
    else
    {
        *p = NULL;
    }
    return;
}

遍歷

三種常見的前序、中序、後序遍歷:指針

// 這裏pfprocData,是用來處理結構體裏面的數據部分的函數
void frontOrder(TREE_NODE_S *p, pfprocData pfunc)
{
    if (NULL == p)
    {
        return;
    }
    pfunc(&(p->data));
    frontOrder(p->pL, pfunc);
    frontOrder(p->pR, pfunc);
    return;
}

void middleOrder(TREE_NODE_S *p, pfprocData pfunc)
{
    if (NULL == p)
    {
        return;
    }
    middleOrder(p->pL, pfunc);
    pfunc(&(p->data));
    middleOrder(p->pR, pfunc);
    return;
}

void lastOrder(TREE_NODE_S *p, pfprocData pfunc)
{
    if (NULL == p)
    {
        return;
    }
    lastOrder(p->pL, pfunc);
    lastOrder(p->pR, pfunc);
    pfunc(&(p->data));
    return;
}

測試

// 先建立出以下兩種樹,而後作遍歷輸出

//          1
//        /   \
//      2      4
//       \
//        3
char ps1[] = {1, 2, INVALID, 3, INVALID, INVALID, 4, INVALID, INVALID};

//        1
//      /   \
//    2      6
//   / \      \
//  3   5      7
//   \
//    4
char ps2[] = {1, 2, 3, INVALID, 4, INVALID, INVALID, 5, INVALID, INVALID, 6, INVALID, 7, INVALID, INVALID};

// 這裏只對節點數據進行打印
void procData(char *p)
{
    printf("%u ", *p);
}

int main(void)
{
    TREE_NODE_S *pstTreeHead1 = NULL;
    TREE_NODE_S *pstTreeHead2 = NULL;

    pstTreeHead1 = createTree2(ps1);
    pstTreeHead2 = createTree2(ps2)

    // 若是使用第二個建立方法,則:
    // createTree(&pstTreeHead1, ps1);
    // createTree(&pstTreeHead2, ps2);

    printf("%-14s", "frontOrder:");
    frontOrder(pstTreeHead1, procData);
    printf("\n");

    printf("%-14s", "frontOrder:");
    frontOrder(pstTreeHead2, procData);
    printf("\n");

    printf("%-14s", "middleOrder:");
    middleOrder(pstTreeHead2, procData);
    printf("\n");

    printf("%-14s", "lastOrder:");
    lastOrder(pstTreeHead2, procData);
    printf("\n");
}
相關文章
相關標籤/搜索