1. 程式人生 > >C++演算法之 在二叉樹當中找出和為某一值的路徑

C++演算法之 在二叉樹當中找出和為某一值的路徑

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

採用先序遍歷以及 棧的特性 後進先出:

void PrintPath(BTree* pRoot,int sum, const int key)
{
	static deque<int>  stack;

	if (pRoot == NULL)
	{
		return;
	}
	if (sum+pRoot->m_nValue == key) //如果當前值加上路徑和為目標值,則輸出
	{
		for (int i = 0; i < stack.size(); i++)
		{
			cout<<stack[i]<<"->";
		}
		cout<<pRoot->m_nValue<<endl;

		return;
	}
	else if (sum + pRoot->m_nValue > key)//如果大於目標值,則返回
	{
		return;
	}
	else//如果小於,則入棧
	{
		stack.push_back(pRoot->m_nValue);
		sum += pRoot->m_nValue;

		PrintPath(pRoot->m_nLeft,sum,key);
		PrintPath(pRoot->m_nRight,sum,key);

		sum -= pRoot->m_nValue;
		stack.pop_back();
	}
	
}


完整測試程式碼:

// PrintPath.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include <iostream>
#include <list>
#include <queue>
#include <deque>
using namespace std;

//節點的資料結構
class BTree
{
public:
	int       m_nValue;
	BTree*    m_nLeft;
	BTree*    m_nRight;
public:
	BTree(int value)
	{
		m_nValue = value;
	}
};

//二叉樹的插入實現
void Insert(int value, BTree* &root)
{
	if (root == NULL)
	{
		root = new BTree(value);
	}
	else if(value < root->m_nValue)
		Insert(value,root->m_nLeft);
	else if(value > root->m_nValue)
		Insert(value,root->m_nRight);
	else
		;
}
void PrintPath(BTree* pRoot,int sum, const int key)
{
	static deque<int>  stack;

	if (pRoot == NULL)
	{
		return;
	}
	if (sum+pRoot->m_nValue == key) //如果當前值加上路徑和為目標值,則輸出
	{
		for (int i = 0; i < stack.size(); i++)
		{
			cout<<stack[i]<<"->";
		}
		cout<<pRoot->m_nValue<<endl;

		return;
	}
	else if (sum + pRoot->m_nValue > key)//如果大於目標值,則返回
	{
		return;
	}
	else//如果小於,則入棧
	{
		stack.push_back(pRoot->m_nValue);
		sum += pRoot->m_nValue;

		PrintPath(pRoot->m_nLeft,sum,key);
		PrintPath(pRoot->m_nRight,sum,key);

		sum -= pRoot->m_nValue;
		stack.pop_back();
	}
	
}


int _tmain(int argc, _TCHAR* argv[])
{


	BTree* m_pRoot = new BTree(5);
	Insert(7,m_pRoot);
	Insert(3,m_pRoot);
	Insert(4,m_pRoot);
	Insert(2,m_pRoot);

	PrintPath(m_pRoot,0,12);


	getchar();
	return 0;
}

相關推薦

C++演算法當中路徑

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

的所有路徑

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

的所有路徑-java實現

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

每日一道演算法題4——在二元的所有路徑

題目:輸入一個整數和一棵二元樹。從樹的根節點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。打印出和與輸入整數相等的所有路徑。 例如輸入整數22和如下二元樹 則打印出兩條路徑:10,12和10,5,7 參考程式碼: #include <i

程式設計師面試一百題-04-在二元的所有路徑

1-題目 : 輸入一個整數和一棵二元樹;從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑;打印出和與輸入整數相等的所有路徑。 2-示例 : 輸入整數22和如下二元樹,則應答應出兩條路徑10-12和10-5-7。 3-思路 : 3.1-當訪問到某一結點時,把該結點

C++ Leetcode初級演算法

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

演算法分層遍歷

通過佇列實現二叉樹的分層遍歷,換行可以使用last和nLast兩個變數,每次新增新的最右節點記錄nLast,每次從佇列彈棧記錄一個節點node,node==last換行,把nLast賦值給last,用二維陣列遍歷。  ArrayList<ArrayList<Integer&

演算法中序前序序列 或後序 求解

                這種題一般有二種形式,共同點是都已知中序序列。如果沒有中序序列,是無法唯一確定一棵樹的。<1>已知二叉樹的前序序列和中序序列,求解樹。1、確定樹的根節點。樹根是當前樹中所有元素在前序遍歷中最先出現的元素。2、求解樹的子樹。找出根節點在中序遍歷中的位置,根左邊的所有元

維矩形裝箱演算法

我們要解決兩個問題:1.如何將所有二維矩形塊放入一個矩形框內。2.在滿足問題1的情況下,矩形框的最小寬度和高度是多少。期望的效果圖: 下面我們就來解決以上問題。1. 把矩形塊放在固定大小的框內假設有一個固定大小的矩形框,比如1024x768,我們怎麼把矩形塊裝在裡面?答案:使

演算法中序前序序列(或後序)求解

這種題一般有二種形式,共同點是都已知中序序列。如果沒有中序序列,是無法唯一確定一棵樹的。 <1>已知二叉樹的前序序列和中序序列,求解樹。 1、確定樹的根節點。樹根是當前樹中所有元素在前序遍歷中最先出現的元素。 2、求解樹的子樹。找出根節點在中序遍歷中的位置,根左

演算法各種遍歷

樹形結構是一類重要的非線性資料結構,其中以樹和二叉樹最為常用。 二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。二叉樹的每個結點至多隻

演算法的遞迴非遞迴遍歷(轉)

原文地址 【寫在前面】   二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序、中序以及後序三種遍歷方法。因為樹的定義本身就 是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且程式碼很簡潔。而對於樹的遍歷若採用非遞迴的方法,就要採

leetcode104 給定一個其最大深度。

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

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

c語言實現的遍歷建立程式(附帶註釋)

/******************************************************************/ //樹的遞迴思想,把每個節點當作是一棵樹,以後序遍歷為例 //步驟1:訪問左子樹.2訪問右子樹3.列印當前節點的值 //在節點遍歷時如果

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

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

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

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

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

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

劍指offer:第25題值得路徑

//思路:可以利用全路徑逐層遞減,在用遞迴來尋找路徑 import java.util.ArrayList; import java.util.List; public class _Test_25_2 { ArrayList<ArrayList

樹根節點到子節點的所有路徑(Java實現)

該問題應該屬於二叉樹遍歷一類的問題吧。簡單描述一下:/** * 輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。 * 如下二叉樹,和25 *             8 *