設計一個演算法求節點值為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的所有元素(mink和maxk是給定的兩個引數,其值可以和表中的元素相同,也可以不同)。
語言: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
已知兩個連結串列A和B分別表示兩個集合,其元素遞增排列。請設計一個演算法,用於求出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 {