如何在不使用递归的情况下遍历一棵二杈树

如何在不使用递归的情况下遍历一棵二杈树

使用工具:循环 + 栈;
其实递归也是使用了内存中的栈。

思想如下:
对左节点依次做, 入栈
直到一个节点不存在左孩子时,出栈
出栈后,看其是否存在右孩子,
不存在,继续出栈
存在,则将其右孩子,入栈 …… 如此循环。

示例代码:

    //将节点存入一个list中,得到一个排序好的集合(对排序树遍历)
    List<Note> list = new ArrayList<Note>();
        Stack<Note> stack = new Stack<Note>();
        //先取树的根节点
        Note note = this.root;
        do {
            //入栈
            stack.push(note);
            //如果节点存在左孩子,则继续入栈
            if (note.lchild != null) {
                note = note.lchild;
            }

            //出栈
            else {
                while (true){
                    note = stack.pop();
                    list.add(note);
                    if (null != note.rchild) {
                        note = note.rchild;
                        break;
                    }
                }
            }

        } while (stack.size() != 0 || note.rchild != null); 

如何删除一个二杈排序树的非叶子节点?

  1. 用该节点左树的最大结点替换该节点(左小右大时)
  2. 用该节点右树的最小结点替换该节点(左小右大时)

猜你喜欢

转载自blog.csdn.net/weixin_37077950/article/details/81100968