資料結構-二叉樹(葉子節點到根節點的路徑相關問題)
二叉樹的括號表示法: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、自己確定一個二叉樹(樹結點型別、數目和結構自定)利用鏈式儲存結構方法儲存。實現樹