(所与の値、及びこれらのパスの記録であるリーフノードへのルートからのパスかどうかを決定しました。)
私の方法:この問題考えと私は戻ってやる基づいている、我々は再帰関数の現在の値を保存し、削除するために、データ構造を必要とするが追加されました。再帰的に入る時にここでパスを印刷するには、我々はまた、あなたが唯一のパラメータと同じ値を作成する必要があり、あなたはまた、文字列を選択することができ、彼らは簡単にサイトを保護するために最後に要素を削除することができ、など、スタック、リストを選択することができます効果は関数出口の時にシーンを保護するために行うことができます。最初の条件が満たされたときに再帰的に決定し、その後、再帰ダウン現在ノードの値を追加します。
public void findPath(TreeNode root, int target){
if (root == null) {
return;
}
Stack<TreeNode> path = new Stack<TreeNode>();
int sum = 0;
find2(path, root, sum, target);
}
private void find(Stack<TreeNode> path, TreeNode root, int sum, int target){
if(sum > target)return;
if(root == null && sum < target)return;
if(root == null && sum == target){
for(TreeNode treeNode : path){
System.out.print(treeNode.val+" ");
}
System.out.println();
return;
}
if(root != null){
if(root.left != null || root.right != null){//如果左右子树有不空的,向下寻找
if(root.left != null){
path.push(root);
sum += root.val;
find(path, root.left, sum, target);
sum -= root.val;
path.pop();
}
if(root.right != null){
path.push(root);
sum += root.val;
find(path, root.right, sum, target);
sum -= root.val;
path.pop();
}
}else{//如果左右子树都空了,说明到了叶子节点
path.push(root);
sum += root.val;
//发送结束信息
find(path, null, sum, target);
sum -= root.val;
path.pop();
}
}
}
方法ブック:まず、本ノードの値を追加した状態かどうかを決定し、その後再帰ダウン。
public void findPath(TreeNode root, int target){
if (root == null) {
return;
}
Stack<TreeNode> path = new Stack<TreeNode>();
int sum = 0;
find2(path, root, sum, target);
}
private void find2(Stack<TreeNode> path, TreeNode root, int sum, int target){
path.push(root);
sum += root.val;
if(sum > target){
path.pop();
return;
}
if(sum == target && root.left == null && root.right == null){
//从栈底到栈顶打印
for(TreeNode treeNode : path){
System.out.print(treeNode.val+" ");
}
System.out.println();
}
if(root.left != null)find2(path, root.left, sum, target);
if(root.right != null)find2(path, root.right, sum, target);
//保护现场
path.pop();
}
この質問は、リーフノードにルートノードから必要とすることなく、任意の経路である場合。次にアイデアは、内部通路を見つけるために、外側の層は、再帰的なバイナリツリートラバーサルで、再帰の二層に分割されなければなりません。