1. 程式人生 > >二叉樹路徑和--只記錄和&記錄路徑

二叉樹路徑和--只記錄和&記錄路徑

一、問題描述

1、只記錄和

給定一棵二叉樹和一個和,確定樹是否有從根到葉的路徑,使得沿路徑加起來的所有值等於給定的總和。
【示例】
給定下面的二叉樹 以及待求和 sum = 22,
          5
        /   \
      4     8
     /     /  \
   11  13   4
   /  \     \
 7    2      1

返回 true, 因為存在一個從根到葉的路徑:5->4->11->2 和為:22.

2、記錄路徑

給定一個二叉樹和一個和,找到每個路徑的總和等於給定總和的所有根到葉路徑。

【舉例】給定下面的二叉樹,以及和 sum = 22,
            5
         /     \
       4       8
      /       /   \
   11     13    4
   /  \    /  \
 7    2  5   1
返回:
[
   [5,4,11,2],
   [5,8,4,5]

]

二、解題思路

1、只記錄和

幾個注意點:
    1)題目要求返回true/false,不需要記錄路徑
    2)給定結點沒說是正整數,因此必須走到葉子結點才知道是否找到,沒法剪枝,只能樸素深度搜索

    3)一旦找到sum結果,立即return

2、記錄路徑

dfs

三、解題演算法

1、只記錄和

/*********************************************
Author:tmw
date:2018-5-8
*********************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode
{
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
}TreeNode;

bool hasPathSum(TreeNode* root, int sum)
{
    if( !root ) return false;

    /**走到葉子結點,判斷當前sum值與葉子結點值是否相等**/
    if( root->left == NULL && root->right == NULL )
        return root->val == sum;
    /**沒走到葉子結點:左右孩子都可以走,更新sum**/
    return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val);
}

2、記錄路徑

/*******************************************
Author:tmw
date:2018-5-8
*******************************************/
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode
{
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
}TreeNode;

/**
 *returnSize  -- 返回的結果陣列有多少組
 **columnSizes -- 返回的結果陣列每一組有多少個元素
*/
#define MAX_SIZE 1000
/**
    *cur_array : 用於暫存中間值
    **result  : 最終滿足和為sum的所有路徑
    *colmn_size : 用於記錄每條路徑有多少元素
**/
int i=0;
int count = 0;
int colmn_size[MAX_SIZE];
void get_pathSum( TreeNode* root, int sum, int* cur_array, int** result )
{
    if( root==NULL ) return;

    cur_array[i++] = root->val;

    /**當遍歷到葉子結點時,判斷該路徑下的和值是否滿足sum,滿足則記錄到result陣列中**/
    if( root->left == NULL && root->right == NULL )
    {
        /**滿足則記錄到result陣列中**/
        if( root->val == sum )
        {
            int j;
            for( j=0; j<i; j++ )
                result[count][j] = cur_array[j];
            colmn_size[count] = i;
            count++;
        }
    }

    /**記錄左子樹路徑**/
    get_pathSum( root->left, sum-root->val, cur_array, result);
    /**記錄右子樹路徑**/
    get_pathSum( root->right, sum-root->val, cur_array, result);
}

int** pathSum(TreeNode* root, int sum, int** columnSizes, int* returnSize)
{
    if( root == NULL ) return NULL;

    /**自定義二維的結果陣列,用來儲存最終結果並返回**/
    int** result = (int**)malloc(MAX_SIZE*sizeof(int*));
    int ii;
    for( ii=0; ii<MAX_SIZE; ii++ )
        result[ii] = (int*)malloc(MAX_SIZE*sizeof(int));

    /**自定義臨時一維陣列用於暫存結果值**/
    int* temp_res = (int*)malloc(MAX_SIZE*sizeof(int));

    get_pathSum(root,sum,temp_res,result);

    /**賦值**/
    *returnSize = count;
    printf("%d",count);
    for( ii=0;ii<count;ii++ )
        (*columnSizes)[ii] = colmn_size[ii];

    return result;
}

夢想還是要有的,萬一實現了呢~~~ヾ(◍°∇°◍)ノ゙~~~~


相關推薦

刷題:輸入一顆一個整數,打印出中結點值的為輸入整數的所有路徑

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

劍指offer66題--Java實現,c++實現python實現 24.中和為某一值的路徑

題目描述 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) C++ /* struct TreeNode { int val; s

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

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

輸入一顆一個整數,打印出中結點值的為輸入整數的所有路徑

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

深度優先遍歷廣度優先遍歷

因此 怎麽 code ron inf 技術 廣度優先搜索 二叉樹的遍歷 eat 對於一顆二叉樹,深度優先搜索(Depth First Search)是沿著樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。以上面二叉樹為例,深度優先搜索的順序為:ABDECFG。怎麽實現這個順序

層次序創建(圖形界面控制臺輸入實現)

ride repaint 註冊 read public ria span performed ttext 1 2018.11.7 2 XT 3 4 /** 5 * 功能:構造二叉樹 6 * 說明: 7 * 1.主函數輸入模式有兩種,BT

[leetcode]的最大深度最小深度

一、二叉樹的最大深度 題目描述: Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node d

遍歷(迴圈遞迴)

遞迴 1.前序遍歷 void preorder(BinTree *T) { if(T==NULL) return; cout << T->data; preorder(T->left); preorder(T->rig

系列(1)——基本概念遍歷

二叉樹是一種非常重要的資料結構,其在查詢、排序等領域有著非常重要的應用。本文簡單介紹一些關於二叉樹的基本概念,並給出幾種二叉樹的基本遍歷方法。全文程式碼為Java語言實現。 二叉樹的基本概念 1. 二叉樹的定義 定義: 二叉樹是n(n >= 0)個節

線索的原理以及建立遍歷(c++)

這是一篇非常好的關於線索二叉樹的文章,內容詳細到位,敘述清晰。作者應該是很認真、細心的人,估計花了不少時間和精力,向作者致敬! 一、線索二叉樹概念 具有 n 個結點的二叉連結串列中,其二叉連結串列的 n 個結點中共有 2n 個指標域,在這 2n 個指標域中,真正

根據前序遍歷中序遍歷序列求解後序遍歷的演算法

問題模型:已知某二叉樹前序遍歷序列為1,2,3,4,5,6,中序遍歷為3,2,4,1,6,5,設計程式計算後序序列。 關於這個問題你可以通過前序遍歷和中序遍歷建立一顆樹,然後通過後序遍歷進行求解,當然還可以直接根據已知兩序列直接推理後序序列,本文將對這種分析進行介紹。 利用

最近公共父節點(記錄根到某一節點路徑

 題目:二叉樹的結點定義如下:     struct TreeNode    {               int m_nvalue;              TreeNode* m_pLeft;              TreeNode* m_pRight; };

的最大深度最小深度實現

二叉樹的最大深度 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的距離。 如果二叉樹為空,則深度為0 如果不為空,分別求左子樹的深度和右子樹的深度,取最大的再加1. 二叉樹的最小深度 給定一個二叉樹,找出其最小深度。

系列——根據前序中序、中序後序構建

1、根據前序和中序構建二叉樹 思路:在二叉樹的前序遍歷序列中,第一個數字總是樹的根節點的值。但在中序遍歷序列中,根節點的值在序列的中間,左子樹的節點的值位於根節點的值得左邊,而右子樹的節點的值位於根節

已知後序遍歷中序遍歷,求前序遍歷

後續遍歷的順序是左右根,中序遍歷的順序是左根右  這點應該懂吧  由後續訪問序列可以看出最後一個被訪問的必定是這個樹的根  而中序遍歷的序列可以看出,一棵樹當根確定後,在根前面被訪問的是他的左子樹,後邊的是他的右子樹元素  弄懂了上邊兩點就開始做題吧  由後序遍歷序列是DBCEFGHA  為了方便,我寫小寫字

已知一個按先序序列輸入的字元序列,如abc,,de,g,,f,,,(其中逗號表示空節點)。請建立並按中序後序方式遍歷,最後求出葉子節點個數深度。

這是一個標準的模板題 記下了就完事了! Input   輸入一個長度小於50個字元的字串。 Output 輸出共有4行: 第1行輸出中序遍歷序列; 第2行輸出後序遍歷序列; 第3行輸出葉子節點個數; 第4行輸出二叉樹深度。 Sample Input abc,,

C:C語言前序建立的兩種方式前序遍歷的方法

#include<stdio.h> #include<stdlib.h> typedef struct BiTreeNode { int data; struct BiTre

的轉換,森林的轉化

樹具有二叉連結串列的形式,可以將其他形式的樹轉化為二叉連結串列的形式。並且森林合併樹也是基於二叉連結串列形式的樹進行合併的。下面給出程式碼: /** * @Title: CTree.java * @Package tree * @Description

遍歷的前驅後繼規則說明

二叉樹遍歷的遞迴演算法和非遞迴演算法我們當然應該很熟悉了,不過還有另外一種遍 歷方式,就是增加了樹的構造,然後不允許遞迴或是用到棧進行遍歷,如線索樹或者是 有父母節點的二叉樹等等等等。這樣的遍歷就需要我們找到一個節點的後繼,同樣如果 有更變態的題要求我們找一個節點的前驅,也