PHP 输入一棵二叉树和一个数字n,要求找出路径和为n的所有路径
2012-09-27 19:18
281 查看
<?php #输入一棵二叉树和一个数字n,要求找出路径和为n的所有路径 class Node { public $data = null; public $parent = null; public $left = null; public $right = null; } #使用数组构造完全二叉树 function build_cbtree($a) { $root = new Node(); $root->data = $a[0]; for ($i = 1; $i < count($a); $i++) { $node = new Node(); $node->data = $a[$i]; insert_node($root, $node); } return $root; } #插入完全二叉树节点 function insert_node($root, $inode) { #使用树的广度优先遍历顺序取出节点,直到找到第一个左右子节点没满的节点,将待插入节点插入节点左边或右边 $queue = array(); array_unshift($queue, $root); while (!empty($queue)) { $cnode = array_pop($queue); if ($cnode->left == null) { $cnode->left = $inode; $inode->parent = $cnode; return $root; } else { array_unshift($queue, $cnode->left); } if ($cnode->right == null) { $cnode->right = $inode; $inode->parent = $cnode; return $root; } else { array_unshift($queue, $cnode->right); } } return $root; } #树的广度优先遍历 function bf_traverse($root) { $queue = array(); array_unshift($queue, $root); while (!empty($queue)) { $cnode = array_pop($queue); echo $cnode->data . " "; if ($cnode->left !== null) array_unshift($queue, $cnode->left); if ($cnode->right !== null) array_unshift($queue, $cnode->right); } echo "<br>"; } function get_paths($root, $paths, $sum) { if ($root != null) { $sum -= $root->data; $paths[] = $root->data; if ($sum > 0) { #继续递归 #此处paths是传值调用,所以可以算出多条路径而互不影响 if ($root->left != null) get_paths($root->left, $paths, $sum); if ($root->right != null) get_paths($root->right, $paths, $sum); } else if ($sum == 0) { #输出路径 foreach ($paths as $val) { echo $val . " "; } echo "<br>"; } } } $a = array(9, 8, 7, 6, 8, 4, 3, 2, 1); $root = build_cbtree($a); bf_traverse($root); #广度优先遍历 $b = array(); get_paths($root, $b, 25); #输出路径和为25的路径 ?>
9 8 7 6 8 4 3 2 1
9 8 6 2
9 8 8
相关文章推荐
- 找出二叉树所有根到叶子的路径,使得路径和为某一个指定的数字
- flag2在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如 输入整数
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3
- 用户输入一个单词,要求在一个字典中找出该单词的所有兄弟单词,并输出
- 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- <仅是自己做笔记。。。系列-4>输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径
- 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。
- 一个正整数有可能可以被表示为 m(m>=2) 个连续正整数之和,编写一个程序,输入一个正整数,然后找出符合这种要求的所有 连续正整数序列,若不存在这种序列,则打印None。
- 输入一个整数和一棵二元树,打印出所有和为该整数的二元树中的路径
- 面试题:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
- java实现输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
- 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径(剑指offer)
- 每天学习一算法系列(6) (输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径)
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所 有偶数位于数组的后半部分。要求时间复杂度为O(n)。
- 输入一个整数和一棵二元树。求出从根节点到叶节点的路径长度中与输入整数相等的所有路径。
- 剑指offer_输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{
- 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{