1. 程式人生 > >設計一個演算法求節點值為x和節點y值得兩個節點的最近共同祖先

設計一個演算法求節點值為x和節點y值得兩個節點的最近共同祖先

思想:採用非遞迴後序遍歷二叉樹b.當找到節點值為x的節點時將棧中所有節點值存放在anorx陣列中(如圖所示的二叉樹,F節點的anorx為“ACF”),當找到節點值為y的節點時將棧中所有節點值存放在anory陣列中(對於如圖所示的二叉樹,E節點的anory為“ACE”),當兩個節點均已找到後,通過比較找到他們最近的公共祖先(對於如圖所示的二叉樹,F和E節點的最近公共祖先為C),對應的演算法如下:


int commancestor(BTNode *b,ElementType x,ElementType y)

{

ElementType anorx[MaxSize],anory[MaxSize];

BTNode *St[MaxSize];//定義一個順序棧

BTNode *p=b,*q;

int flag,top=-1,i;//棧指標置初值

bool findx=false,findy=false;

if(b!=NULL)

{

do

{

while(p!=NULL)//將*p所有左節點進棧

{

top++;

St[top]=p;

p=p->lchild;

}

q=NULL;//q指向棧頂節點的前一個已訪問的節點

flag=1;//設定flag=1表示處理棧頂節點

while(top!=-1&&flag==1)

{

p=St[top];//取當前的棧頂元素

if(p->rchild==q)//右孩子不存在或右孩子已被訪問,訪問之


{

if(p->data==x)//要訪問的節點為要找的節點

{

for(i=0;i<top;i++)//將路徑存入anorx中

{

anorx[i]=St[i]->data;

}

findx=true;

}

else if(p->data==y)//將路徑存入anory中

{

for(i=0;i<=top;i++)

{

anory[i]=St[i]->data;

}

findy=true;

}

if(findx&&findy)//x和y均已找到

{

i=0;

while(anorx[i]==anory[i])

i++;

printf("最近公共祖先:%c\n",anorx[i-1]);

return 1;

}

top--;

q=p;//q指向剛被訪問的節點

}

else

{

p=p->rchild;//p指向右孩子節點

flag=0;//設定flag=0表示棧頂節點處理完畢

}

}

}while(top!=-1);//棧不空迴圈

printf("\n");

}

return 0;

}

相關推薦

設計一個演算法節點x節點y值得節點最近共同祖先

思想:採用非遞迴後序遍歷二叉樹b.當找到節點值為x的節點時將棧中所有節點值存放在anorx陣列中(如圖所示的二叉樹,F節點的anorx為“ACF”),當找到節點值為y的節點時將棧中所有節點值存放在an

設計一個遞迴演算法刪除不帶頭節點單鏈表L中所有x節點

#include "stdafx.h" #include<stdio.h> #include<malloc.h> #include<stdlib.h> typed

設計一個演算法,通過一趟遍歷確定長度n的單鏈表中最大的結點。

語言:C++ #include <iostream> using namespace std; typedef int Elemtype; typedef struct LNode { Elemtype data; struct LNode *next; }LNode,*Lin

假設二叉樹中每個結點的單個字元, 設計一個演算法將一棵以二叉鏈方式儲存的二叉樹 b 轉換成對應的順序儲存結構 a。——含具體實現工程

假設二叉樹中每個結點的值為單個字元, 設計一個演算法將一棵以二叉鏈方式儲存的二叉樹 b 轉換成對應的順序儲存結構 a。——李春葆資料結構第五版第七章,P246,第十題 思路解析: 解:設二叉樹的順序儲存結構型別為SqBTree,先將順序儲存結構a中所有元素置為‘#’(表示空結點)。將b轉

給定一個二叉樹,節點0-9,從根節點到葉子結點組成一個數,二叉樹所有組成的數的

 根節點 到葉子節點組成一個數 前序遍歷  每層的值都為上一層*10+本層結點的值 int sumNumbers(TreeNode *root) { int sum=0; if(root==NULL) re

長度n的順序表L,編寫一個時間複雜度O(n),空間複雜度O(1)的演算法,該演算法刪除線性表中所有X的元素

解法:用K記錄順序表L中不等於X的元素個數,邊掃描L邊統計K,並將不等於X的元素向前放置K位置上,最後修改L長度 void  del_x_1(SqList &L,Elemtype x){ int k=0; for(i=0;i<L.length;i++) {

設計一個演算法,刪除遞增有序連結串列中大於mink且小於maxk的所有元素(minkmaxk是給定的引數,其可以表中的元素相同,也可以不同)。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

設計一個演算法,將連結串列中所有結點的連結串列方向“原地”逆轉,即要求僅利用原表的儲存空間,換句話說,要求演算法的空間複雜度O(1)。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

已知連結串列AB分別表示集合,其元素遞增排列。請設計一個演算法,用於出A與B的交集,並存放在A連結串列中。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

C 二叉樹查詢x節點,並列印其所有的父節點

思路就跟輸出二叉樹一樣的,只不過這次是找節點 文章目錄 查詢節點 輸出此節點所有的父節點 查詢節點 //找一個值為x的節點 BiThrTree findElement(BiThrTree T, ElementType x){

給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大最小;教材2-15

給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值; 解:要求對於陣列用小於【3n/2-2】的比較次數找到兩個最值 可以用陣列第一個元素來初始化max,min 然後遍歷陣列,分別和max,min比較,一遍就可以找

題目 10 帶頭節點的單鏈表,刪除所有X節點,並釋放空間

帶頭節點的單鏈表,刪除所有值為X的節點,並釋放空間 void del_allX(Node*& n, int value){ Node *pre = n, *p = n->next,*q; while(p!=NULL){ if(p->num==valu

設計一個演算法,將一個十進位制的數轉化二進位制

#include<iostream.h> const int StackSize=10; class SeqStack {     public:        SeqStack(){

在二叉查詢樹中尋找節點,使它們的一個給定

給定一個二叉搜尋樹和一個目標結果,如果 BST 中存在兩個元素且它們的和等於給定的目標結果,則返回 true。 使用中序遍歷得到有序陣列之後,再利用雙指標對陣列進行查詢。 應該注意到,這一題不能用分別在左右子樹兩部分來處理這種思想,因為兩個待求的節點可能分別在左右子樹中。 /** *

二叉搜尋樹的最小節點絕對值之差/在二叉查詢樹中尋找節點,使它們的一個給定/找出 BST 中的所有眾數(出現頻率最高的元素)。

關於二叉樹的數值運算,一般考慮借用中序遍歷為陣列;再進行計算的思想。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *

已知線性表中元素以遞增有序排列,並以單鏈表作為儲存結構,設計一個演算法,刪除表中相同的多餘元素

/* 已知線性表中元素以值遞增有序排列,並以單鏈表作為儲存結構 * 設計一個演算法,刪除表中值相同的多餘元素 * 使得操作後表中所用元素值均不同,同時釋放被刪除的結點空間 */ #include<stdio.h> #inclu

【資料結構 C描述】設計一個演算法,用於檢測給定的字串是否對稱串。

【資料結構 C描述】設計一個演算法,用於檢測給定的字串是否為對稱串。 所謂對稱串,就是字串從左往右讀和從右往左讀的序列一樣。 例如: abccba是對稱串。 abcabc不是對稱串。 //main.cpp #include <iostream> #include

程式設計師面試金典: 9.4樹與圖 4.2給定有向圖,設計一個演算法,找出節點之間是否存在一條路徑。

#include <iostream> #include <stdio.h> #include <vector> #include <queue> using namespace std; /* 問題:給定有向圖,設計一個

設計一個演算法,判斷一個二叉樹是否完全二叉樹

思想:根據完全二叉樹的定義,對完全二叉樹按照從上到下、從左到右的層次遍歷,應該滿足一下兩條要求: ●某節點沒有左孩子,則一定無右孩子 ●若某節點缺左或右孩子,則其所有後繼一定無孩子 若不滿足上述任何一

6_44_二叉樹中x節點根的子樹的深度

#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct node {