列印二叉查詢樹中與輸入整數相等的所有路徑
從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。
打印出和與輸入整數相等的所有路徑。
思路:
建立一個由雙向連結串列組成的棧,之所以用棧是因為遞迴,之所以用雙向連結串列是為了可以順序列印路徑。
然後在二叉查詢樹中遞迴尋找路徑。
程式碼如下:
#include<stdio.h>
#include<stdlib.h>
//二叉查詢樹資料結構
struct BSTreeNode;
struct BSTreeNode
{
int m_nValue;
BSTreeNode *m_pLeft;
BSTreeNode *m_pRight;
};
//雙向連結串列棧資料結構
struct Node;
typedef Node* Link;
struct Node
{
int data;
Link next;
Link pre;
};
struct Stack
{
Link pHead;//頭節點
Link pEnd;//尾節點
};
//建立二叉查詢樹
void addBSTreeNode(BSTreeNode *&pCurrent,int value)
{
if(NULL==pCurrent)
{
BSTreeNode *pBSTree=new BSTreeNode();
pBSTree->m_pLeft=NULL;
pBSTree->m_pRight=NULL;
pBSTree->m_nValue=value;
pCurrent=pBSTree;
}
else
{
if((pCurrent->m_nValue)>value)
addBSTreeNode(pCurrent->m_pLeft,value);
else if((pCurrent->m_nValue)<value)
addBSTreeNode(pCurrent->m_pRight,value);
else
return;
}
}
void Push(Stack &S,int element)
{
if(S.pHead==NULL)
{
S.pHead=(Link)malloc(sizeof(Node));
S.pEnd=(Link)malloc(sizeof(Node));
if(S.pEnd==NULL || S.pHead==NULL)
{
printf("out of space\n");
return;
}
S.pHead->data=element;
S.pHead->next=NULL;
S.pHead->pre=NULL;
S.pEnd=S.pHead;
}
else
{
Link NewNode;
NewNode=(Link)malloc(sizeof(Node));
if(NewNode==NULL)
{
printf("out of space\n");
return;
}
NewNode->data=element;
NewNode->next=S.pHead;
S.pHead->pre=NewNode;
NewNode->pre=NULL;
S.pHead=NewNode;
}
}
int IsEmpty(Stack S)
{
if(S.pHead!=NULL)
return 0;
else
return 1;
}
void Pop(Stack &S)
{//注意最後一個節點刪除時需特殊考慮
Link temp;
if(!IsEmpty(S))
{
if(S.pHead==S.pEnd)
{
temp=S.pHead;
S.pHead=NULL;
S.pEnd=NULL;
free(temp);
}
else
{
temp=S.pHead;
S.pHead=S.pHead->next;
S.pHead->pre=NULL;
free(temp);
}
}
}
void Print_Stack(Stack S)
{//從尾節點開始列印棧的內容
Link temp=S.pEnd;
while(temp)
{
printf("%6d",temp->data);
temp=temp->pre;
}
}
void Find_Path(BSTreeNode* T,Stack &S,int num)
{
if(T->m_nValue==num)
{
Print_Stack(S);
printf("%6d\n",T->m_nValue);
}
else if(num-T->m_nValue<T->m_nValue)//該條件下只能從左子樹中查詢
{
if(T->m_pLeft)
{
Push(S,T->m_nValue);
Find_Path(T->m_pLeft,S,num-T->m_nValue);
Pop(S);
}
else return;
}
else if(num-T->m_nValue>T->m_nValue)//左右子樹分別進行查詢
{
if(T->m_pLeft)
{
Push(S,T->m_nValue);
Find_Path(T->m_pLeft,S,num-T->m_nValue);
Pop(S);
}
if(T->m_pRight)
{
Push(S,T->m_nValue);
Find_Path(T->m_pRight,S,num-T->m_nValue);
Pop(S);
}
}
}
int main()
{
BSTreeNode *pRoot=NULL;
Stack S;
S.pEnd=NULL;
S.pHead=NULL;
addBSTreeNode(pRoot,10);
addBSTreeNode(pRoot,6);
addBSTreeNode(pRoot,8);
addBSTreeNode(pRoot,9);
addBSTreeNode(pRoot,7);
addBSTreeNode(pRoot,11);
addBSTreeNode(pRoot,12);
Find_Path(pRoot,S,33);
}
輸出:
10 6 8 9
10 11 12
請按任意鍵繼續. . .
相關推薦
列印二叉查詢樹中與輸入整數相等的所有路徑
輸入一個整數和一棵二元樹。 從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。打印出和與輸入整數相等的所有路徑。 思路: 建立一個由雙向連結串列組成的棧,之所以用棧是因為遞迴,之所以用雙向連結串列是為了可以順序列印路徑。 然後在二叉查詢樹中遞迴尋找路徑。 程
二叉查詢樹中的刪除
刪除 將一個結點從二叉查詢樹中刪除之後,剩下的結點可能會不滿足二叉查詢樹的性質,因此,在刪除結點之後要對樹進行調整,使其滿足二叉查詢樹的性質。根據結點的孩子的數量,將刪除操作分為三種情況,我們記要刪除的結點為z,實際上刪除的結點為y。 1. z結點沒有孩子。 如
在二叉查詢樹中尋找兩個節點,使它們的和為一個給定值
給定一個二叉搜尋樹和一個目標結果,如果 BST 中存在兩個元素且它們的和等於給定的目標結果,則返回 true。 使用中序遍歷得到有序陣列之後,再利用雙指標對陣列進行查詢。 應該注意到,這一題不能用分別在左右子樹兩部分來處理這種思想,因為兩個待求的節點可能分別在左右子樹中。 /** *
二叉搜尋樹的最小節點絕對值之差/在二叉查詢樹中尋找兩個節點,使它們的和為一個給定值/找出 BST 中的所有眾數(出現頻率最高的元素)。
關於二叉樹的數值運算,一般考慮借用中序遍歷為陣列;再進行計算的思想。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *
二叉查詢樹中節點的包含,插入,刪除操作
二叉查詢樹最近在看大話資料結構,遇到二叉查詢樹,原理上聽起來比較簡單,但是要實際寫程式碼實現的時候感覺還是有點困難。1. 二叉查詢樹的定義: 一棵空數,或者是具有如下性質的二叉樹: ①若左子樹不空,則左子樹上所有節點的值均小於它根節點上的值。
LintCode 11. 二叉查詢樹中搜索區間 Python
描述 給定兩個值 k1 和 k2(k1 < k2)和一個二叉查詢樹的根節點。找到樹中所有值在 k1 到 k2 範圍內的節點。即列印所有x (k1 <= x <= k2) 其中 x 是二叉查詢樹的中的節點值。返回所有升序的節點值。 樣例 如果有 k1 = 10 和
二叉樹-二叉查詢樹中搜索區間-中等
描述 給定兩個值 k1 和 k2(k1 < k2)和一個二叉查詢樹的根節點。找到樹中所有值在 k1 到 k2 範圍內的節點。即列印所有x (k1 <= x <= k2) 其中 x 是二叉查詢樹的中的節點值。返回所有升序的節點值。 您在真實的面試中是否遇到
找出二叉查詢樹中第n大的值
問題: 給一個二叉查詢樹(BST),找出第 k 大的值。比如: 該圖中,第3大的值是10. 分析: 我們可以通過類似中序遍歷的方法把BST從大到小排序,然後,就可以得到第 k 大的值了。程式碼如下: public class NthNode { // k r
LintCode-----11.二叉查詢樹中搜索區間
原題目 中序遍歷後比較 8056s import java.util.*; import java.lang.*; public class Solution { /*
11. 二叉查詢樹中搜索區間
給定兩個值 k1 和 k2(k1 < k2)和一個二叉查詢樹的根節點。找到樹中所有值在 k1 到 k2 範圍內的節點。即列印所有x (k1 <= x <= k2) 其中 x 是二叉查詢樹的中的節點值。返回所有升序的節點值。樣例如果有 k1 = 10 和 k2
LintCode:M-二叉查詢樹中搜索區間
給定兩個值 k1 和 k2(k1 < k2)和一個二叉查詢樹的根節點。找到樹中所有值在 k1 到 k2 範圍內的節點。即列印所有x (k1 <= x <= k2) 其中 x 是二叉查詢樹的中的節點值。返回所有升序的節點值。
lintcode-二叉查詢樹中搜索區間-11
給定兩個值 k1 和 k2(k1 < k2)和一個二叉查詢樹的根節點。找到樹中所有值在 k1 到 k2 範圍內的節點。即列印所有x (k1 <= x <= k2) 其中 x 是二叉查
【資料結構週週練】022 從大到小輸出二叉排序樹中小於某個值的所有結點編號及資料
一、二叉排序樹 今天給大家分享的是二叉排序樹的應用,從大到小輸出二叉排序樹中小於某個值的所有結點編號及資料。 我們知道,我們做中序遍歷時,先訪問左子樹,再訪問根節點,最後訪問右子樹;通過中序遍歷會得到一個遞增的序列。該應用要求得到從大到小,一個遞減的序列,我們可以通過先訪
*(5)輸入互不相同的一組整數,構造一棵二叉排序樹,要求: ① 按遞減有序的順序輸出; ② 輸入一個整數,查詢該整數是否在該二叉排序樹中,查詢成功返回1,否則返回0; ③ 在②中,若查詢成功,則將該結
/*(5)輸入互不相同的一組整數,構造一棵二叉排序樹,要求: ① 按遞減有序的順序輸出; ② 輸入一個整數,查詢該整數是否在該二叉排序樹中,查詢成功返回1,否則返回0; ③ 在②中,若查詢成功,則將該結點從二叉排序樹中刪除。 */ #include<stdio.h&g
資料結構:由有序數列建立一棵高度最小的二叉排序樹與判斷一 個序列是否為該二叉排序樹中的一個合法查詢序列
編寫一個程式,對於給定的一個有序的關鍵字序列,建立一棵高度最小的二叉排序樹。並判斷一個序列是否為該二叉排序樹中的一個合法的查詢序列 #include<stdio.h> #include<stdlib.h> typedef struct node
資料結構與演算法總結——二叉查詢樹及其相關操作
我實現瞭如下操作 插入,查詢,刪除,最大值 樹的高度,子樹大小 二叉樹的範圍和,範圍搜尋 樹的前序,中序,後序三種遍歷 rank 前驅值 在這一版本的程式碼中,我使用了類模板將介面與實現分
按資料元素在表中的次序構造一棵二叉查詢樹
二叉排序樹具有如下性質: (1) 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值; (2) 若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值; (3) 左、右子樹也分別為二叉排序樹. 元素(19.14.22.01.66.21
【資料結構與演算法】之二叉查詢樹 --- 第十三篇
樹是一種非線性資料結構,這種資料結構要比線性資料結構複雜的多,因此分為三篇部落格進行講解: 第一篇:樹的基本概念及常用操作的Java實現(二叉樹為例) 第二篇:二叉查詢樹 第三篇:紅黑樹 本文目錄 1、二叉查詢樹的基本概念 2、二叉查詢樹的查詢操作 3、二叉查詢樹的插
刷題:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。
原題:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 思路分析:首先思考節點值的和為輸入的整數,每條路徑都一定是從根節點到葉子節點,在資料結構中從根節點到葉子節點的遍歷稱之為深度優先遍歷DFS。因此整
劍指offer——二叉查詢樹與雙向連結串列(36題)
題目:輸入一棵二叉查詢樹,將該二叉查詢樹換成一個排序的雙向連結串列,要求不能建立任何新的節點,只能調整樹中節點指標的指向。 解題思想:又一是道二叉樹遍歷演算法的變型題,一定要往這個方向上面思考。此處採用中序遍歷(主體)演算法進行解題。 #include<iostre