设计一个非递归算法,从一棵二叉树中查找出所有节点的最大值并返回。

不要复制,谢谢。... 不要复制,谢谢。 展开
 我来答
mxl033
2013-09-18 · TA获得超过216个赞
知道小有建树答主
回答量:120
采纳率:61%
帮助的人:83.4万
展开全部

给个思路:

    找最大值的关键是树的遍历,而递归的遍历方式,就是利用函数调用,参数的入栈出栈,来达到回溯的目的,同理,不用递归调用,我们也可以采用这个思想

  1. 创建一个栈式的数据结构

  2. 将根节点指针压入栈中,访问其值,假如我们采用广度优先的遍历方式,就遍历其子节点

  3. 在访问子节点的同时,依次将访问过的节点指针压入栈中,而最上面的节点就是最后访问的节点

  4. 如最上面的节点是叶子节点,则弹栈,否则继续遍历其子节点,并如3步所说,依访问顺序压栈

  5. 对于所有子节点都已遍历(压栈)的父节点,做标记,则当弹栈后,栈的最上面是一个带有标记的非叶子节点,亦将其弹出栈

  6. 循环3-5步,直到栈空为止

深度优先搜索,也可以用类似的方式实现

追问
能写个程序吗?
追答
步骤很清楚了,有问题可以讨论,程序就算了
hejiekkk
2013-09-18 · 超过11用户采纳过TA的回答
知道答主
回答量:36
采纳率:0%
帮助的人:30.4万
展开全部
java实现 :

import java.util.Scanner;
import java.util.Vector;
/** BinaryTree .java
*
*/

public class BinaryTree{
public BinaryTree (Node root){
root.left=construct(root.left);
}
public Node construct(Node node){
System.out.println("input next node id(num):");
int id = Integer.parseInt(new Scanner(System.in).nextLine());
if(id!=-1) node=new Node(id);
else return null;
node.left=construct(node.left);
node.right=construct(node.right);
return node;
}
public int visitMax(Node root){
Vector<Node> tasks=new Vector<Node>();
Node tmp = root.left;
tasks.add(tmp);
int max=-1;
while(!tasks.isEmpty()){
while(tmp!=null){
if(max<tmp.visitMax())
max=tmp.visitMax();
tasks.add(tmp);
tmp=tmp.left;
}
tmp=tasks.lastElement();
tasks.remove(tmp);
tmp=tmp.right;
}
return max;
}
public static void main(String[] args) {
Node root=new Node(0);
BinaryTree bt=new BinaryTree(root);
System.out.println("max num is:"+bt.visitMax(root));
}
}
//BinaryTree .java

class Node{
int num;
Node left,right;
Node(int num){
this.num=num;
}
public int visitMax(){
System.out.println("visited:"+this.num);
return num;
}
};
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-09-18
展开全部
直接for循环遍历?二叉树节点信息是装在数组里面的直接for遍历数组不就行了?当然如果不是数组,直接遍历类似的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式