日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二叉树遍历的非递归方法

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树遍历的非递归方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://blog.csdn.net/qiuxinfa123/article/details/84880786
2.先序遍歷。非遞歸先序遍歷的思路如下:
1.先將根節點入棧
2.訪問根節點
3.如果根節點存在右孩子,則將右孩子入棧
4.如果根節點存在左孩子,則將左孩子入棧(注意:一定是右孩子先入棧,然后左孩子入棧)
5.重復2-4

//先序遍歷非遞歸public void preOrder2(){Stack<Node> stack = new Stack();Node p = root;stack.push(p);while (!stack.empty()){p = stack.pop();//輸出當前節點System.out.println(p);//右節點不為空入棧if (p.right != null){stack.push(p.right);}if (p.left != null){stack.push(p.left);}}}

3.中序遍歷。 非遞歸中序遍歷的思路如下:
1.先將根節點入棧
2.將當前節點的所有左孩子入棧,直到左孩子為空
3.訪問棧頂元素,如果棧頂元素存在右孩子,則繼續第2步
4.重復第2、3步,直到棧為空并且所有的節點都被訪問

//中序遍歷非遞歸public void infixOrder2(){Stack<Node> stack = new Stack<>();Node p = root;while (p != null || !stack.empty()){//根節點和當前節點的所有左子節點入棧while (p != null){stack.push(p);p = p.left;}//訪問棧頂p = stack.pop();//輸出System.out.println(p);if (p.right != null){p = p.right;}else {p = null;}}}

4.后序遍歷。 后續遍歷的非遞歸實現思路:
1.根節點入棧
2.將根節點的左子樹入棧,直到最左,沒有左孩子為止
3.得到棧頂元素的值,先不訪問,判斷棧頂元素是否存在右孩子,如果存在并且沒有被訪問,則將右孩子入棧,否則,就訪問棧頂元素

//后序遍歷非遞歸public void postOrder2(){Stack<Node> stack = new Stack<>();Node p = root;Node pre = null;//上一次訪問的節點while (p!=null || !stack.empty()){//根節點和所以左孩子入棧while (p != null){stack.push(p);p = p.left;}//訪問棧頂元素但不出棧p = stack.peek();if (p.right == null || p.right == pre){p = stack.pop();System.out.println(p);pre = p;p = null;}else {p = p.right;}}}

總結

以上是生活随笔為你收集整理的二叉树遍历的非递归方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。