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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常考数据结构与算法-morris遍历

發(fā)布時(shí)間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常考数据结构与算法-morris遍历 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


下圖右邊就是左邊的樹的morris序

只要一個(gè)節(jié)點(diǎn)有左樹,該節(jié)點(diǎn)一定會到達(dá)兩次.

后序

public class Code_MorrisTraversal {public static class Node{public int value;Node left;Node right;public Node(int data){this.value = data;}}/** 4* 2 6* 1 3 5 7**/public static void main(String[] args) {Node head = new Node(4);head.left = new Node(2);head.right = new Node(6);head.left.left = new Node(1);head.left.right = new Node(3);head.right.left = new Node(5);head.right.right = new Node(7);morrisPre(head);morrisIn(head);morrisPos(head);}public static void process(Node node){if(null == node){return;}// 1process(node.left);// 2process(node.right);// 3}public static void morris(Node head){if(null == head){return;}Node cur = head;Node mostRight = null;while(cur != null){mostRight = cur.left;if(null != mostRight){// 如果有左子樹while (null != mostRight.right && mostRight.right != cur){mostRight = mostRight.right;}// cur左樹上最右節(jié)點(diǎn)if(null == mostRight.right){mostRight.right = cur;cur = cur.left;continue;}else{mostRight.right = null;}}cur = cur.right;}}// 先序遍歷public static void morrisPre(Node head){if(null == head){return;}Node cur = head;Node mostRight = null;while(cur != null){mostRight = cur.left;if(null != mostRight){// 如果有左子樹while (null != mostRight.right && mostRight.right != cur){mostRight = mostRight.right;}// cur左樹上最右節(jié)點(diǎn)if(null == mostRight.right){System.out.println(cur.value); // 第一次碰到該節(jié)點(diǎn),打印該節(jié)點(diǎn)mostRight.right = cur;cur = cur.left;continue;}else{mostRight.right = null;}}else{System.out.println(cur.value);}cur = cur.right;}}// 中序遍歷public static void morrisIn(Node head){if(null == head){return;}Node cur = head;Node mostRight = null;while(cur != null){mostRight = cur.left;if(null != mostRight){// 如果有左子樹while (null != mostRight.right && mostRight.right != cur){mostRight = mostRight.right;}// cur左樹上最右節(jié)點(diǎn)if(null == mostRight.right){mostRight.right = cur;cur = cur.left;continue;}else{mostRight.right = null;}}System.out.println(cur.value);cur = cur.right;}}// 后序遍歷public static void morrisPos(Node head){if(null == head){return;}Node cur = head;Node mostRight = null;while(cur != null){mostRight = cur.left;if(null != mostRight){// 如果有左子樹while (null != mostRight.right && mostRight.right != cur){mostRight = mostRight.right;}// cur左樹上最右節(jié)點(diǎn)if(null == mostRight.right){mostRight.right = cur;cur = cur.left;continue;}else{mostRight.right = null;printEdge(cur.left); // 該節(jié)點(diǎn)的左子數(shù)的右節(jié)點(diǎn)逆序}}cur = cur.right;}printEdge(head); // 頭節(jié)點(diǎn)的右節(jié)點(diǎn)逆序}public static void printEdge(Node node){Node tail = reverseEdge(node);Node cur = tail;while(null != cur){System.out.println(cur.value+" ");cur = cur.right;}reverseEdge(tail);}public static Node reverseEdge(Node from){Node pre = null;Node next = null;while(from != null){next = from.right;from.right = pre;pre = from;from = next;}return pre;} }

總結(jié)

以上是生活随笔為你收集整理的常考数据结构与算法-morris遍历的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。