1. 程式人生 > >資料結構-二叉樹(葉子節點到根節點的路徑相關問題)

資料結構-二叉樹(葉子節點到根節點的路徑相關問題)

二叉樹的括號表示法:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))

實現的功能:

        1.輸出所有的葉子節點

        2.輸出所有葉子節點到根節點的路徑

        3.輸出2中第一條最長的路徑

複習資料結構中......,程式碼適合接觸過資料結構的老鐵解惑時看,程式執行結果是正確的,當然有的陣列範圍設定可以根據情況修改:

#include <iostream>
#include<malloc.h>
#include<stdio.h>
using namespace std;
typedef struct node
{
    char data;
    struct node* lchild;
    struct node* rchild;
}BTNode;
void CreaBT(BTNode *&b,char *str)
{
    BTNode *St[100],*p;
    int top=-1,k,j=0;
    char ch;
    b=NULL;
    ch=str[j];
    while(ch!='\0')
    {
        switch(ch)
        {
            case '(':top++;St[top]=p;k=1;break;
            case ')':top--;break;
            case ',':k=2;break;
            default:
                p=(BTNode*)malloc(sizeof(BTNode));
                p->data=ch;p->lchild=p->rchild=NULL;
                if(b==NULL)
                    b=p;
                else
                {
                    switch(k)
                    {
                        case 1:St[top]->lchild=p;break;
                        case 2:St[top]->rchild=p;break;
                    }
                }
        }
        j++;
        ch=str[j];
    }
}
//輸出所有葉子節點到根節點的路徑(非遞迴)
void AllPath(BTNode *b)
{
    struct node
    {
        int parent;
        BTNode *node;
    }qu[100];
    BTNode *q;
    int front,rear,p;
    front=rear=-1;
    rear++;
    qu[rear].node=b;
    qu[rear].parent=-1;
    while(front!=rear)
    {
        front++;
        q=qu[front].node;
        if(q->lchild==NULL&&q->rchild==NULL)
        {
            p=front;
            while(qu[p].parent!=-1)
            {
                cout<<qu[p].node->data<<"->";
                p=qu[p].parent;
            }
            cout<<qu[p].node->data<<endl;
        }
        if(q->lchild!=NULL)
        {
            rear++;
            qu[rear].node=q->lchild;
            qu[rear].parent=front;
        }
        if(q->rchild!=NULL)
        {
            rear++;
            qu[rear].node=q->rchild;
            qu[rear].parent=front;
        }
    }
}
//遞迴得到每個葉子結點到根節點的路徑
void AllPath1(BTNode *b,char path[],int pathLen)
{
    if(b!=NULL)
    {
        if(b->lchild==NULL&&b->rchild==NULL)
        {
            cout<<b->data<<"到根節點路徑:"<<b->data;
            for(int i=pathLen-1;i>=0;i--)
                cout<<"->"<<path[i];
            cout<<endl;
        }
        else
        {
            path[pathLen]=b->data;
            pathLen++;
            AllPath1(b->lchild,path,pathLen);
            AllPath1(b->rchild,path,pathLen);
            pathLen--;
        }
    }
}
//葉子結點到根節點最長路徑長度
void LongPath(BTNode *b,char path[],int pathLen,char longpath[],int &longpathlen)
{
    if(b==NULL)
    {
        if(pathLen>longpathlen)
        {
            for(int i=pathLen-1;i>=0;i--)
                longpath[i]=path[i];
            longpathlen=pathLen;
        }
    }
    else
    {
        path[pathLen]=b->data;
        pathLen++;
        LongPath(b->lchild,path,pathLen,longpath,longpathlen);
        LongPath(b->rchild,path,pathLen,longpath,longpathlen);
        pathLen--;
    }
}
void DispBT(BTNode *b)
{
    if(b!=NULL)
    {
        cout<<b->data;
        if(b->lchild!=NULL||b->rchild!=NULL)
        {
            cout<<'(';
            DispBT(b->lchild);
            if(b->rchild!=NULL)
                cout<<',';
            DispBT(b->rchild);
            cout<<')';
        }
    }
}
int main()
{
    BTNode *b;
    char s[100],path[100],longpath[100];
    int pathlen=0,longpathlen=0;
    gets(s);
    CreaBT(b,s);
    AllPath(b);
    AllPath1(b,path,pathlen);
    LongPath(b,path,0,longpath,longpathlen);
    cout<<"第一條最長路徑長度:"<<longpathlen<<endl;
    cout<<"第一條最長路徑:";
    cout<<longpath[longpathlen-1];
    for(int i=longpathlen-2;i>=0;i--)
        cout<<"->"<<longpath[i];
    cout<<endl;
    DispBT(b);
    return 0;
}

相關推薦

資料結構-葉子節點節點路徑相關問題

二叉樹的括號表示法:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))實現的功能:        1.輸出所有的葉子節點        2.輸出所有葉子節點到根節點的路徑        3.輸出2中第一條最長的路徑複習資料結構中......,程式碼適合

資料結構——程式碼

 二叉樹 C++ 環境codeblocks17 通過 /* 二叉樹 使用了自定義的 棧 和 佇列 @CGQ 2018/10/29 */ #include <iostream> #include <stdio.h> #include <stdlib.h&

資料結構C語言實現

以下所有內容來自網易雲課堂——資料結構(小甲魚版) 對於樹來說,一旦可以指明他的分支數,那麼就可以用連結串列來實現了 二叉樹是應用廣泛的樹,因為現實世界大部分模型都只包含0,1這兩種情況,非常適合用二叉樹 如下: typedef struct BiNode {

資料結構--C++

零、二叉樹解決的問題 通過學習陣列和連結串列,前者可以在常數時間內找到目標物件,但是插入和刪除操作,都需要耗費線性的時間。後者則可以在常數時間內進行插入和刪除,但是查詢某一元素,則需要線性時間。很顯然各有利弊,所以我們能不能選用一種更好的結構呢?樹結構則是很好

資料結構-遞迴前序、中序、後序遍歷;棧實現中序變數;映象

* *前序、後序、中序變數二叉樹(遞迴解法) *中序 棧實現 *深度遍歷 佇列實現 *應用:二叉樹映象(劍指offer) */ typedef struct BiTNode *BiTree;//結點指標 //前序遍歷 void preOrderTra

資料結構--線索連結串列

//// Threaded Binary Tree.cpp : Defines the entry point for the console application. /*-----CODE FOR FUN--------------- -------CREATED BY

資料結構-1以及前序、中序、後序遍歷python實現

上篇文章我們介紹了樹的概念,今天我們來介紹一種特殊的樹——二叉樹,二叉樹的應用很廣,有很多特性。今天我們一一來為大家介紹。 二叉樹 顧名思義,二叉樹就是隻有兩個節點的樹,兩個節點分別為左節點和右節點,特別強調,即使只有一個子節點也要區分它是左節點還是右節點。 常見的二叉樹有一般二叉樹、完全二叉樹、滿二叉樹、線

資料結構----輸出中從到每個葉子節點路徑遍歷演算法的應用 .

void AllPath(Bitree T, Stack &S)//輸出二叉樹上從根到所有葉子結點的路徑 { if(T) { Push(S,T->data); if(!T->Left&&!T->Right)/

資料結構-基礎題目小結遍歷,求節點數目等等

給定一個前序序列陣列構造一個二叉樹 思路:首先序列中要有給定的非法值,也就是二叉樹中對應的空節點;對於構造一個二叉樹可以使用遞迴的思想:先構造當前節點,再構造左子樹,再右子樹,直到遇到非法值時

基本資料結構——的建立,遍歷,求葉子節點,深度計算

/* 新建立一棵二叉樹,遍歷,查詢樹的高度,查詢樹的葉子節點,和總結點數  然後再計算距離最遠的兩個節點。 SQ 2014-04-20 */ #include<stdio.h> struct Node{     int data;     struct Node

Python資料結構——的遍歷,中,後

先序遍歷:根左右 中序遍歷:左根右 後序遍歷:左右根 # -*- coding:utf-8 -*- # file: TreeTraversal.py # class BTree: # 二叉樹節點 def __init__(self, value):

資料結構——:基本C++

內容概要: 二叉樹相關概念 簡單二叉樹模板類的實現:二叉樹的遍歷、計算高度、計算節點數目 注意事項 一、二叉樹相關概念: 第一部分: 節點(node),根節點(root),左子樹(left subtree),右子樹(right suntree),子節點

資料結構——的遞迴與非遞迴遍歷先序,中序,後序

實驗專案五 二叉樹基本操作的實現 課程名稱:資料結構 實驗專案名稱:二叉樹基本操作的實現 實驗目的: 1.掌握樹的基本操作—遍歷。 實驗要求: 1、 分別用遞迴和非遞迴的方法實現一棵樹的三種遍歷。 實驗過程: 建立一棵二叉樹(二叉樹如下圖所示);

資料結構——的建立和遍歷遞迴建樹&層序遍歷建樹

資料結構作業模板存檔 #include<stdio.h> #include <cstdlib> #include <iostream> #include <stack> #include<queue&g

資料結構-的遍歷Java實現

二叉樹介紹 二叉樹的概念:一棵二叉樹是節點的一個有限集合,該集合或者為空,或者由一個根節點加上兩棵左子樹和右子樹組成 二叉樹具有如下特點: 1、每個結點最多有兩棵子樹,結點的度最大為2。 2、左子樹和右子樹是有順序的,次序不能顛倒。 3、即使某結點只有

資料結構----的插入順序結構

按順序結構將一個二叉樹插入另一個二叉樹,本程式要求插入的二叉樹和原二叉樹沒有交集,而且右子樹為空。 #include <stdio.h> /* EOF(=^Z或F6),NULL */ #include <stdlib.h> #include <

資料結構--的遍歷--求的深度後序遍歷

二叉樹為空:深度為0; 二叉樹為0:深度為1; 一般的二叉樹:深度=max{左子樹的深度,右子樹的深度} + 1。 int Depth (BiTree T) { if (!T)//如果二叉樹根節點為空,則深度為0 depthval=0; else {

資料結構| |的三種遍歷方式遞迴&&非遞迴

首先來寫一下遞迴的! 對於遞迴要將大問題轉化為小問題,並且要有一個結束的位置。 比如:要前序遍歷一個二叉樹,那就是先訪問根節點,然後在訪問根節點的左子樹,在訪問根節點的右子樹,而左子樹與右子樹,又可以變成訪問該節點和該結點的左子樹和右子樹。這就變成了一個遞迴

資料結構的實現#表示空結點

參考老師給的程式碼重新進行對二叉樹的實現與操作(畢竟是老師出題,風格要跟他來) 這一次的二叉樹是通過結點進行構建。 首先初始化二叉樹,就是將根節點開闢一個結點空間,進行初始化。 然後按照先序序列建立二叉樹則是通過遞迴左右子樹進行構建,輸入如果是 ‘#’,則

資料結構|的鏈式儲存實驗6.2

一、實驗目的 1、   熟練理解樹和二叉樹的相關概念,掌握的儲存結構和相關操作實現; 2、   掌握樹的順序結構的實現; 3、   學會運用樹的知識解決實際問題 二、 實驗內容 1、自己確定一個二叉樹(樹結點型別、數目和結構自定)利用鏈式儲存結構方法儲存。實現樹