二叉树

二叉树的定义

二叉树的存储结构

链表结构:

typedef struct TNode *Position;
typedef Position BinTree; /* 二叉树类型 */
struct TNode{ /* 树结点定义 */
    ElementType Data; /* 结点数据 */
    BinTree Left;     /* 指向左子树 */
    BinTree Right;    /* 指向右子树 */
};

包含较多别名的写法如下:

typedef struct treenode
{
    char data;
    struct treenode* LChild;
    struct treenode* RChild;
}NODE,*LPNODE,*LPTREE;

//struct treenode : NODE
//struct treenode* : LPNODE或LPTREE
NODE node1;
struct treenode* p = NULL;
LPNODE p1 = NULL;

二叉树的创建

非递归方式

实现代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode *LPNODE;
typedef LPNODE BinTree;
typedef char ElementType;

struct TreeNode
{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

LPNODE CreateNode(ElementType Data)
{
    LPNODE newNode = (LPNODE)malloc(sizeof(struct TreeNode));
    newNode->Left = NULL;
    newNode->Right = NULL;
    newNode->Data = Data;
    return newNode;
}

/* 非递归创建树 */
void InsertNode(BinTree parent, LPNODE Left, LPNODE Right)
{
    parent->Left = Left;
    parent->Right = Right;
}

void PreOrderTraversal(BinTree BT)
{
    if(BT)
    {
        printf("%c ",BT->Data);
        PreOrderTraversal(BT->Left);
        PreOrderTraversal(BT->Right);
    }
}

void InOrderTraversal(BinTree BT)
{
    if(BT)
    {
        InOrderTraversal(BT->Left);
        printf("%c ",BT->Data);
        InOrderTraversal(BT->Right);
    }
}

void PostOrderTraversal(BinTree BT)
{
    if(BT)
    {
        PostOrderTraversal(BT->Left);
        PostOrderTraversal(BT->Right);
        printf("%c ",BT->Data);
    }
}

int main()
{
    LPNODE A = CreateNode('A');
    LPNODE B = CreateNode('B');
    LPNODE C = CreateNode('C');
    LPNODE D = CreateNode('D');
    LPNODE E = CreateNode('E');
    LPNODE F = CreateNode('F');
    InsertNode(A,B,C);
    InsertNode(B,D,NULL);
    InsertNode(C,E,NULL);
    InsertNode(E,NULL,F);
    PreOrderTraversal(A);
    printf("\n");
    InOrderTraversal(A);
    printf("\n");
    PostOrderTraversal(A);
    printf("\n");
    return 0;
}
A B D C E F
D B A E F C
D B F E C A

递归方式

实现代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;

typedef struct TreeNode
{
    ElementType Data;
    struct TreeNode* Left;
    struct TreeNode* Right;
}NODE,*LPNODE,*LPTREE;

/* 递归创建树 */
void createTree(LPTREE* root)
{
    char userKey = '\0';
    scanf_s("%c",&userKey,1);
    if(userKey == '#')
    {
        *root = NULL;
    }
    else
    {
        *root = (LPTREE)malloc(sizeof(struct TreeNode));
        (*root)->Data = userKey;
        createTree(&(*root)->Left);
        createTree(&(*root)->Right);
    }
}

void PreOrderTraversal(LPTREE BT)
{
    if(BT)
    {
        printf("%c ",BT->Data);
        PreOrderTraversal(BT->Left);
        PreOrderTraversal(BT->Right);
    }
}

int main()
{
    LPTREE root = NULL;
    createTree(&root);
    printf("PreOrderTraversal:\n");
    PreOrderTraversal(root);
    printf("\n");
    return 0;
}

ABD###CE#F###
PreOrderTraversal:
A B D C E F

二叉树的遍历

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode *LPNODE;
typedef LPNODE BinTree;
typedef char ElementType;

struct TreeNode
{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

LPNODE CreateNode(ElementType Data)
{
    LPNODE newNode = (LPNODE)malloc(sizeof(struct TreeNode));
    newNode->Left = NULL;
    newNode->Right = NULL;
    newNode->Data = Data;
    return newNode;
}

void InsertNode(BinTree parent, LPNODE Left, LPNODE Right)
{
    parent->Left = Left;
    parent->Right = Right;
}

void PreOrderTraversal(BinTree BT)
{
    if(BT)
    {
        printf("%c ",BT->Data);
        PreOrderTraversal(BT->Left);
        PreOrderTraversal(BT->Right);
    }
}

void PreOrderTraversalByStack(BinTree BT)
{
    if(BT == NULL)
        return;
    LPNODE pMove = BT;
    LPNODE stack[100];
    int stackTop = -1;
    while(stackTop != -1 || pMove)
    {
        while(pMove)
        {
            printf("%c ",pMove->Data);
            stack[++stackTop] = pMove;
            pMove = pMove->Left;
        }
        if(stackTop != -1)
        {
            pMove = stack[stackTop--];
            pMove = pMove->Right;
        }
    }

}

void InOrderTraversal(BinTree BT)
{
    if(BT)
    {
        InOrderTraversal(BT->Left);
        printf("%c ",BT->Data);
        InOrderTraversal(BT->Right);
    }
}

void InOrderTraversalByStack(BinTree BT)
{
    if(BT == NULL)
        return;
    LPNODE pMove = BT;
    LPNODE stack[100];
    int stackTop = -1;
    while(stackTop != -1 || pMove)
    {
        while(pMove)
        {
            stack[++stackTop] = pMove;
            pMove = pMove->Left;
        }
        if(stackTop != -1)
        {
            pMove = stack[stackTop--];
            printf("%c ",pMove->Data);
            pMove = pMove->Right;
        }
    }

}

void PostOrderTraversal(BinTree BT)
{
    if(BT)
    {
        PostOrderTraversal(BT->Left);
        PostOrderTraversal(BT->Right);
        printf("%c ",BT->Data);
    }
}

void PostOrderTraversalByStack(BinTree BT)
{
    if(BT == NULL)
        return;
    LPNODE pMove = BT;
    LPNODE stack[100];
    int stackTop = -1;
    LPNODE placeVisited = NULL;

    while(pMove)
    {
        stack[++stackTop] = pMove;
        pMove = pMove->Left;
    }

    while(stackTop != -1)
    {
        pMove = stack[stackTop--];
        if(pMove->Right == NULL || pMove->Right == placeVisited)
        {
            printf("%c ",pMove->Data);
            placeVisited = pMove;
        }
        else
        {
            stack[++stackTop] = pMove;
            pMove = pMove->Right;
            while(pMove)
            {
                stack[++stackTop] = pMove;
                pMove = pMove->Left;
            }
        }
    }

}

void LevelTraversal(BinTree BT)
{
    LPNODE pMove = BT;
    LPNODE queue[100];
    int front = 0;
    int tail = 0;
    queue[tail++] = pMove;
    printf("%c ",pMove->Data);
    while(front != tail)
    {
        pMove = queue[front++];
        if(pMove->Left != NULL)
        {
            queue[tail++] = pMove->Left;
            printf("%c ",pMove->Left->Data);
        }
        if(pMove->Right != NULL)
        {
            queue[tail++] = pMove->Right;
            printf("%c ",pMove->Right->Data);
        }

    }

}

int main()
{
    LPNODE A = CreateNode('A');
    LPNODE B = CreateNode('B');
    LPNODE C = CreateNode('C');
    LPNODE D = CreateNode('D');
    LPNODE E = CreateNode('E');
    LPNODE F = CreateNode('F');
    InsertNode(A,B,C);
    InsertNode(B,D,NULL);
    InsertNode(C,E,NULL);
    InsertNode(E,NULL,F);
    printf("PreOrderTraversal:\n");
    PreOrderTraversal(A);
    printf("\nPreOrderTraversalByStack:\n");
    PreOrderTraversalByStack(A);
    printf("\nInOrderTraversal:\n");
    InOrderTraversal(A);
    printf("\nInOrderTraversalByStack:\n");
    InOrderTraversalByStack(A);
    printf("\nPostOrderTraversal:\n");
    PostOrderTraversal(A);
    printf("\nPostOrderTraversalByStack:\n");
    PostOrderTraversalByStack(A);
    printf("\nLevelTraversal:\n");
    LevelTraversal(A);
    printf("\n");
    return 0;
}
PreOrderTraversal:
A B D C E F
PreOrderTraversalByStack:
A B D C E F
InOrderTraversal:
D B A E F C
InOrderTraversalByStack:
D B A E F C
PostOrderTraversal:
D B F E C A
PostOrderTraversalByStack:
D B F E C A
LevelTraversal:
A B C D E F

1.假定只有四个结点A、B、C、D的二叉树,其前序遍历序列为ABCD,则下面哪个序列是不可能的中序遍历序列?

A.ABCD

B.ACDB

C.DCBA

D.DABC

正确答案:D你选对了

2对于二叉树,如果其中序遍历结果与前序遍历结果一样,那么可以断定该二叉树________

A.是完全二叉树

B.所有结点都没有左儿子

C.所有结点都没有右儿子

D.这样的树不存在

正确答案:B你选对了

3已知一二叉树的后序和中序遍历的结果分别是FDEBGCA 和FDBEACG,那么该二叉树的前序遍历结果是什么?

A.ABDFECG

B.ABDEFCG

C.ABDFEGC

D.ABCDEFG

正确答案:A你选对了