关于多叉树的遍历。

经过了一番查询与思考。目前把平常见的Tree的遍历分成3种情况。

递归遍历。非递归广度优先遍历。非递归深度优先遍历。

事实上,递归遍历属于深度优先遍历的一种。因为这种遍历都是基于栈 数据结构来做运算的。遵循先进后出的原则。
所以在广度上不会被先照顾到,而是后来的,逐渐深入的子节点最新出栈。

而非递归广度优先去遍历一个多叉树要用到 队列 这个东西。
目前java 的linkedList 实现了Queue这个抽象类。
需要注意的是java的队列不能用push 之类的操作。而是其他的一些:

如:
下面简单介绍一下其中常用的方法:

add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常   
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常   
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常   
offer 添加一个元素并返回true 如果队列已满,则返回false   
poll 移除并返问队列头部的元素 如果队列为空,则返回null   
peek 返回队列头部的元素 如果队列为空,则返回null   
put 添加一个元素 如果队列满,则阻塞   
take 移除并返回队列头部的元素 如果队列为空,则阻塞

附应用中写到的2个简单方法。做了遍历、判断,截取需要的树等操作。

/**
* 判断变更一个节点的父节点的操作是否正确。
*
* @param tree,id,pid
* @return boolean
*/
public static boolean isValid_ChangePid(List tree, String id, String pid) {
//遍历一下传入的id。遍历它所有的子节点。如果pid 在这些节点之中的id中。那就非法。
//找到id节点。这个树。
//非递归广度优先遍历。

    boolean result = true;//默认合法

    Queue queue = new LinkedList();
    //linkedlist 实现了Queue。add 与poll

    TreeNode tree2 = findChildrenById(tree, id); //先根据id与总树得到要遍历的树。

    Object test1 = tree2;
    System.out.println(test1);

    queue.add(tree2);//把id作为顶点的树添加进入。


    while (queue.peek() != null)// 第一个元素不为空
    {
        //先 add这个元素的所有子元素到队列。
        for (Object i : queue.element().getChildren()) {
            queue.add((TreeNode) i);

        }
        if (queue.element().getId().equals(pid)) {
            return false;//找到了直接返回。
        }

        queue.poll();//首元素的子处理完成删除。
    }


    return result;
}


/**
 * 在树上寻找一个id的孩子。这个方法尝试用递归深度优先方法实现。
 *
 * @param tree,id
 * @return List TreeNode findChildrenById(List> tree, String id) {

//要求返回一颗树

    for (TreeNode i : tree) {//每个孩子

        if (i.getId().equals(id)) {
            return i;
        } else {//如果不是,从子节点收集结果


            if (i.getChildren() != null) {
                TreeNode t1 = findChildrenById(i.getChildren(), id);
                if (t1 != null) {
                    return t1;
                }
                //孩子不空,找孩子。如果找孩子返回null。则此处不管。继续找
            }
            if (i.getChildren() == null) {

                //如果某个孩子是null先不管。
            }

        }

    }
    //最底下。找完了还没找到。就返回null
    return null;
}

你可能感兴趣的:(关于多叉树的遍历。)