1. 程式人生 > >如何在不使用遞迴的情況下遍歷一棵二杈樹

如何在不使用遞迴的情況下遍歷一棵二杈樹

如何在不使用遞迴的情況下遍歷一棵二杈樹

使用工具:迴圈 + 棧;
其實遞迴也是使用了記憶體中的棧。

思想如下:
對左節點依次做, 入棧
直到一個節點不存在左孩子時,出棧
出棧後,看其是否存在右孩子,
不存在,繼續出棧
存在,則將其右孩子,入棧 …… 如此迴圈。

示例程式碼:

    //將節點存入一個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. 用該節點右樹的最小結點替換該節點(左小右大時)