建立、遍歷二叉樹(二叉鏈表)


建立二叉樹: 

由於先序、中序、后序遍歷的任何一個遍歷結果單獨都不能唯一確定一顆二叉樹,因此不能直接使用其中任何一個遍歷結果來構造二叉樹(原因是不能確定左右子樹的大小(節點數),或者說不知道子樹的結束位置)

雖然先序、中序、后序遍歷任意兩種遍歷結果相結合都可以唯一確定一顆二叉樹,但是很不方便。

所以:只要輸入為‘#’就表示該樹為空,稱為擴展二叉樹             例輸入:ABD##E##C#F##

二叉鏈表存儲:

struct node
{
    char data;
    struct node *L_tree;
    struct node *R_tree;
};
struct node *creat_tree()//建立二叉樹
{
    char ch;
    ch = getchar();
    struct node *Tree;
    Tree = (struct node *)malloc(sizeof(struct node));
    if(ch == '#')
        Tree = NULL;
    else
    {
        Tree->data   = ch;//輸入本節點信息
        Tree->L_tree = creat_tree();//建左子樹
        Tree->R_tree = creat_tree();
    }
    return Tree;
}
  

遞歸先序遍歷:

void preorder_first(struct node *tree)//先序遍歷
{
    if(tree != NULL)
    {
        cout << tree->data << " ";
        preorder_first(tree->L_tree);
        preorder_first(tree->R_tree);
    }
}

遞歸中序遍歷:

void preorder_second(struct node *tree)//中序遍歷
{
    if(tree != NULL)
    {
        preorder_second(tree->L_tree);
        cout << tree->data << " ";
        preorder_second(tree->R_tree);
    }
}

遞歸后序遍歷:

void preorder_third(struct node *tree)//后序遍歷
{
    if(tree != NULL)
    {
        preorder_third(tree->L_tree);
        preorder_third(tree->R_tree);
        cout << tree->data << " ";
    }
}

求樹的深度:tree=NULL 時高度為0。不為空時當前tree高度是其左右子樹高度的最大值+1,左右子樹也是二叉樹,規模變小求解一樣用遞歸

int high(struct node *tree)//數的深度
{
    if(tree == NULL)
        return 0;
    else
        return (max(high(tree->L_tree),high(tree->R_tree))+1);
}

求樹中節點數:

void nodecount(struct node *tree)//節點個數
{
    if(tree != NULL)
    {
        n++;//先序遍歷計數
        nodecount(tree->L_tree);
        //n++;//中序遍歷計數
        nodecount(tree->R_tree);
        //n++;//后序遍歷計數
    }
}

 求樹中葉節點數:

void ye_node(struct node *tree)//葉節點的個數
{
    if(tree != NULL)
    {
        if(tree->L_tree == NULL && tree->R_tree == NULL)
        {
            n1++;
        }
        ye_node(tree->L_tree);
        ye_node(tree->R_tree);
    }
}

 求樹中度為 2 的節點個數:

void have_two_node(struct node *tree)//度為2的節點的個數
{
    if(tree != NULL)
    {
        if(tree->L_tree != NULL && tree->R_tree != NULL)
        {
            n2++;
        }
        have_two_node(tree->L_tree);
        have_two_node(tree->R_tree);
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM