給定乙個二叉樹,找出所有路徑中各節點相加總和。
乙個有效的路徑,指的是從根節點到葉節點的路徑。這樣就是一條有效的路徑,求這個路徑上值的和,以及對應路徑上的值.
當用前序遍歷的方式訪問到某一結點時,我們把該結點新增到路徑(陣列或棧中)上,並累加該結點的值。
如果該結點為葉結點,路徑結束,我們把它列印出來。
如果當前結點不是葉結點,則繼續訪問它的子結點。
當前結點訪問結束後,遞迴函式將自動回到它的父結點。因此我們在函式退出之前要在路徑上刪除當前結點並減去當前結點的值,以確保返回父結點時路徑剛好是從根結點到父結點的路徑。由此可以看出儲存路徑的資料結構實際上是乙個棧,因為路徑要與遞迴呼叫狀態一致,而遞迴呼叫的本質就是乙個壓棧和出棧的過程。
好,下面到**部分.
二叉樹的節點定義, 根據傳入陣列,生成對應的完全二叉樹
@inte***ce treenode : nsobject
/// 根據陣列生成乙個完全二叉樹
+ (treenode *)nodewithdataarray:(nsarray *)dataarray;
/// 生成乙個節點,左右節點為nil
+ (treenode *)nodewithdata:(int)data;
/// 生成乙個節點,左右節點為指定節點
+ (treenode *)nodewithdata:(int)data leftnode:(treenode *)leftnode rightnode:(treenode *)rightnode;
@property (nonatomic, assign) int data;
@property (nonatomic, strong) treenode * leftnode;
@property (nonatomic, strong) treenode * rightnode;
@end
-------
#import "treenode.h"
@implementation treenode
// 實現方式1:根據完全二叉樹的下標(1~n)來處理, 任意子節點的下標/2 都是父節點
+ (treenode *)nodewithdataarray:(nsarray *)dataarray
//根據陣列的數量,生成乙個完全二叉樹
nsmutablearray* treearray = [nsmutablearray array];
//放乙個佔位的值,這樣根節點的下標就對應成treearray[1]了,計算父節點會更容易點
[treearray addobject:[treenode nodewithdata:nan]];
for (int i = 0; i1)
// 如果是奇數,說明是對應父節點的右子節點
if (treearray.count%2==1)
[treearray addobject:temp];
}return treearray[1]; }
/// 實現方式2:模擬層次遍歷, 依次生成子節點並賦值
+ (treenode *)nodewithdataarray2:(nsarray*)dataarray
//模擬佇列結構,進行層次遍歷
nsmutablearray* treearray = [nsmutablearray array];
treenode * root = [treenode nodewithdata:dataarray.firstobject.intvalue];
[treearray addobject:root];
for (int i = 1; i=dataarray.count)
num = dataarray[i];
treenode * rightnode = [treenode nodewithdata:num.intvalue];
father.rightnode = rightnode;
[treearray addobject:rightnode];
}return root;
} + (treenode *)nodewithdata:(int)data
+ (treenode *)nodewithdata:(int)data leftnode:(treenode *)leftnode rightnode:(treenode *)rightnode
- (nsstring *)description
@end
- (void)viewdidload
/// 二叉樹路徑和
- (void)sumtree
- (void)__sumaction:(treenode *)node
// 用陣列模擬乙個棧棧結構
static nsmutablearray * array = nil;
if (array == nil)
[array addobject:@(node.data)];
// 列印當前節點,和當前路徑的和
nslog(@"新增新node:%d sum:%@",node.data,[array valueforkeypath:@"@sum.self"]);
// 前序遍歷,根->左->右
if (node.leftnode)
if (node.rightnode)
// 如果是葉子節點,列印
if (node.leftnode == nil && node.rightnode == nil)
nslog(@"移除此元素 %@",array.lastobject);
二叉樹路徑和
二叉樹中和為某一值的路徑 輸入一棵二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。示例 給定如下二叉樹,以及目標和sum 22,5 4 8 11 13 4 7 2 5 1返回 5,4,11,2 5,8,4,5 public l...
二叉樹的路徑和
給定乙個二叉樹,找出所有路徑中各節點相加總和等於給定 目標值 的路徑。乙個有效的路徑,指的是從根節點到葉節點的路徑。給定乙個二叉樹,和 目標值 5 1 2 4 2 3 返回 1,2,2 1,4 這個題目是二叉樹的遍歷問題,由於是從根節點出發的路徑,所以用先序遍歷。並且維護從當前節點到根節點的所有累加...
二叉樹的路徑和
給定乙個二叉樹,找出所有路徑中各節點相加總和等於給定目標值的路徑。乙個有效的路徑,指的是從根節點到葉節點的路徑。樣例 給定乙個二叉樹,和 目標值 5 1 2 4 2 3 返回 1,2,2 1,4 definition of treenode class treenode class solution...