1. 程式人生 > >求出二叉樹中找出和為某一值的所有路徑

求出二叉樹中找出和為某一值的所有路徑

前段時間什麼也不懂,就跑到騰訊去面試,然後面試官出了這道題,當時已碰演算法就悶,現在給出這道題目的解

另外再次感謝July仁兄對於各種面試題的整理,讓我有這些經典的題來練習。

題目:輸入一個整數和一棵二元樹。
從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。
打印出和與輸入整數相等的所有路徑。
例如輸入整數22 和如下二元樹
10
/ \
5 12
/ \
4 7
則打印出兩條路徑:10, 12 和10, 5, 7。
二元樹節點的資料結構定義為:
struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node
};

分析:

這道題,用樹的遍歷就可以做出來用一個變數記錄從跟節點到葉子節點值,另外還要在遍歷完葉子節點,以及中間節點左右子樹都遍歷完以後減去相應值,即可。下面貼出個人程式碼

/*
查詢等於某一個值的所有路徑
*/
vector<Node<int>*> vec;
int curSum=0;
int   c=0;//記錄個數
void FindRoute(int sum,Node<int> * p){
	if(p!=nullptr){
	vec.push_back(p);
	curSum+=p->GetData();
	if(p->GetLeftChild()==nullptr&&p->GetRightChild()==nullptr)
	{  
		if(curSum==sum){//如果葉子節點的和==sum輸出
		
			for(int i=0;i<vec.size();i++)
			{
				cout<<vec[i]->GetData()<<"  ";  
			}
			cout<<endl;
			c++;
		}
		curSum-=vec.back()->GetData();
		vec.pop_back();
	    return ;
	}
	else{
		if(p->GetLeftChild()!=nullptr)
		{
			FindRoute(sum,p->GetLeftChild());
		}
		if(p->GetRightChild()!=nullptr){
			FindRoute(sum,p->GetRightChild());
		}
		curSum-=vec.back()->GetData();
		vec.pop_back();
	}
  }
}


測試用例:

int main(){
    BinaryTree<int> bin(1);
    Node<int>* r=bin.GetRoot();
    r->SetLeftChild(new Node<int>(2));
    r->SetRightChild(new Node<int>(1));
    r->GetLeftChild()->SetLeftChild(new Node<int>(3));
    r->GetLeftChild()->SetRightChild(new Node<int>(4));
    r->GetRightChild()->SetLeftChild(new Node<int>(4));
    r->GetRightChild()->SetRightChild(new Node<int>(3));
    r->GetRightChild()->GetRightChild()->SetLeftChild(new Node<int>(1));
    bin.MidOrder(r);
    cout<<endl;
    FindRoute(6,r);
    cout<<endl<<"sum"<<c;
    
    system("pause");

}


相關推薦

所有路徑

前段時間什麼也不懂,就跑到騰訊去面試,然後面試官出了這道題,當時已碰演算法就悶,現在給出這道題目的解 另外再次感謝July仁兄對於各種面試題的整理,讓我有這些經典的題來練習。 題目:輸入一個整數和一棵二元樹。 從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑

LeetCode(Binary Tree Maximum Path Sum) 在最大的路徑

題目要求: Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example: Given the belo

所有路徑-java實現

一個小演算法,分享一下思路: 描述: 寫一個程式建立一棵二叉樹,並按照一定規則,輸出二叉樹根節點到葉子節點的路徑。 規則如下: 1、從最頂端的根結點,到最下面的葉子節點,計算路徑通過的所有節點的和,如果與設定的某一值的相同,那麼輸出這條路徑上的所有節點。 2、從根節點遍歷

C++演算法之 在當中路徑

題目:輸入一個整數和一棵二元樹。 從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。 打印出和與輸入整數相等的所有路徑。 例如 輸入整數22和如下二元樹       10          / \        5  12          / \   

3.6 在找到累加指定的最長路徑長度

【題目】:   給定一棵二叉樹的頭節點head和一個32位整數sum,二叉樹節點值型別為整型,求累加和為sum的最長路徑長度。路徑是指從某個節點往下,每次最多選擇一個孩子節點或者不選所形成的的節點鏈   例如, 二叉樹如圖所示               -3           3   &

leetcode700+,遞迴

https://leetcode.com/problems/search-in-a-binary-search-tree/description/ struct TreeNode { int val; TreeNode *left; TreeNode *right;

LeetCode:543. Diameter of Binary Tree(最大的半徑)

Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longest 

最大的子,且子搜尋

題目 找出二叉樹中最大的子樹,該子樹為二叉搜尋樹。所謂最大的子樹就是指結點數目最多的子樹。 分析 該題目是要找出二叉樹中最大的子樹,該子樹必須是二叉搜尋樹(BST)。子樹的概念需要重點關注一下,以下面一棵二叉樹為例          ____10____

兩個結點的第一個公共祖先

題目分析:假設1:這個二叉樹是二叉排序樹(O(N)) 如果題目中的二叉樹是二叉排序樹,那麼這道題目變的相對簡單很多,我們只需要從根節點開始遍歷,有以下三種情況發生: (1)如果題目給的兩個節點的值都大於當前節點,那麼繼續遍歷當前節點的右子樹 (2)如果題目給的兩個節點的值都小於當前節點,那麼繼續遍歷當前節點的

的先序序遍歷,給後序遍歷

logs __main__ font class pre span 思想 style 輸出 實現一個功能: 輸入:一顆二叉樹的先序和中序遍歷 輸出:後續遍歷思想: 先序遍歷中,第一個元素是樹根 在中序遍歷中找到樹根,左邊的是左子樹 右邊的是右子樹

刷題:輸入一個整數,打印結點輸入整數的所有路徑

原題:輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 思路分析:首先思考節點值的和為輸入的整數,每條路徑都一定是從根節點到葉子節點,在資料結構中從根節點到葉子節點的遍歷稱之為深度優先遍歷DFS。因此整

leetcode104 給定一個其最大深度。

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \

leetcode--maximum-depth-of-binary-tree(給定它的最大深度)

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,1

輸入一個整數,打印結點輸入整數的所有路徑(劍指offer)

      解題思路:遍歷二叉樹,採用遞迴的方法,將滿足條件的路徑壓入一維陣列當中,注意當找到滿足條件的路徑時,先將陣列壓入二維陣列,然後將一維陣列中的每個元數彈出,以存放新的路徑。 /* struct TreeNode {int val;struct TreeNode

輸入一個整數,打印結點輸入整數的所有路徑

ger roo pop void set null push ava 所有 題目: 輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 解答: 1 import java.util.*;

LeetCode104 給定一個其最大深度。 的深度根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 /** * Definition for a binary tree node. * struct TreeNode

編寫任意條最長的路徑的演算法,要求輸出此路徑上各結點的路徑的長度。

int Depth(BiTree T)/* 深度 */ { if(T==NULL) return(0); return 1+(Depth(T->lchild)>Depth(T->rchild)? Depth(T->lchild):Depth(T-&

兩個結點的最近公共祖先結點

一、搜尋二叉樹:第一變種是二叉樹是一種特殊的二叉樹:查詢二叉樹。也就是樹是排序過的,位於左子樹上的結點都比父結點小,而位於右子樹的結點都比父結點大。我們只需要從根結點開始和兩個結點進行比較。如果當前結點的值比兩個結點都大,則最低的共同父結點一定在當前結點的左子樹中。如果當前

兩個結點的最近的公共祖先結點

#pragma once #include <iostream> using namespace std; /****************  * 二叉樹中 找兩個結點的最近的公共祖先結