二叉樹Morris遍歷

2021-10-18 20:33:07 字數 3000 閱讀 6026

給定乙個n個節點的二叉樹,完成前、中、後序遍歷,要求時間複雜度為o(n),額外空間複雜度為o(1)

二叉樹遞迴/非遞迴遍歷

(1)如果當前節點的左子樹為空,則當前節點向右移動

(2)如果當前節點的左子樹不為空,則找到左子樹上最右的節點

a.如果最右節點的右孩子為空,則將最右節點的右孩子指向當前節點,當前節點向左移動

b.如果最後節點的右孩子指向當前節點,則將最右節點的右孩子指向空,當前節點向右移動

void

morris

(node *head)

if(mostright-

>right ==

null

)else

if(mostright-

>right == cur)

} cur = cur-

>right;

}}

morris遍歷整個過程最多到達乙個節點兩次,前中序遍歷只是輸出的時機不同

第一次到達該節點就輸出

void

morrispre

(node *head)

if(mostright-

>right ==

null

)else

if(mostright-

>right == cur)

}else

cur = cur-

>right;

} cout << endl;

}

第二次到達該節點就輸出

void

morrisin

(node *head)

if(mostright-

>right ==

null

)else

if(mostright-

>right == cur)

} cout << cur-

>data;

cur = cur-

>right;

} cout << endl;

}

由於後序遍歷的輸出時機是第三次到達乙個節點,但是morris遍歷最多只能到達乙個節點兩次,因此需要特殊處理。

對於可以到達兩次的節點,在第二次到達時逆序輸出該節點的左子樹的右邊界。

最後輸出整棵樹的右邊界即可。

對於逆序輸出,由於額外空間的限制我們需要進行類似於單鏈表反轉的操作。

node*

reverseedge

(node *node)

return pre;

}

void

morrispos

(node *head)

if(mostright-

>right ==

null

)else

if(mostright-

>right == cur)

} cur = cur-

>right;

}printright

(head)

; cout << endl;

}

#include

#include

#include

using

namespace std;

typedef

struct node

}node;

node*

reverseedge

(node *node)

return pre;

}void

printright

(node *node)

reverseedge

(tail);}

void

morris

(node *head)

if(mostright-

>right ==

null

)else

if(mostright-

>right == cur)

} cur = cur-

>right;}}

void

morrispre

(node *head)

if(mostright-

>right ==

null

)else

if(mostright-

>right == cur)

}else

cur = cur-

>right;

} cout << endl;

}void

morrisin

(node *head)

if(mostright-

>right ==

null

)else

if(mostright-

>right == cur)

} cout << cur-

>data;

cur = cur-

>right;

} cout << endl;

}void

morrispos

(node *head)

if(mostright-

>right ==

null

)else

if(mostright-

>right == cur)

} cur = cur-

>right;

}printright

(head)

; cout << endl;

}void

createbtree

(node*

&node)

else

}//abd##fe###cg#h##i##

intmain()

Morris遍歷二叉樹

morris遍歷的實質就是避免用棧結構,而是讓下層到上層有指標,具體是通過讓底層節點指向null的空閒指標指回上層的某個節點,從而完成下層到上層的移動。中序遍歷的過程如下 1.假設當前子樹的頭節點為h,讓h的左子樹中最右節點的right指標指向h,然後h的左子樹繼續步驟1的處理過程,直到遇到某乙個節...

Morris遍歷(二叉樹)

對於每乙個節點來說 對於上面這副圖來說,整個過程 進入節點5 構建 4 5右連線 進入節點3 構建 1 3右連線 進入節點1 列印1 通過 1 3 連線進入3 進入節點3 第二次進入3,列印3 進入節點4 列印4 通過 4 5 連線進入5 進入節點5 第二次進入5,列印5 注意 中序遍歷利用右子節點...

Morris演算法遍歷二叉樹

中序遍歷 演算法步驟 1 如果當前節點的左子節點為空,則輸出當前節點,並將當前節點置為該節點的右子節點。2如果當前節點的左子節點不為空時,則找到當前節點左子樹的最右節點 該節點為當前節點中序遍歷的前驅節點 a 如果最右節點的右指標為空,則將最右節點的右指標指向當前節點,並把當前節點置為其左子節點。b...