二叉樹的非遞迴遍歷

2021-07-02 14:03:01 字數 1230 閱讀 5759

非遞迴一般都用到棧來實現

現在附上**,希望自己在面試的時候更加仔細嚴謹!

後序遍歷採用了乙個prevnode來記錄前乙個訪問的點,當取棧頂的乙個節點後,前乙個訪問的點如果是自己的右孩子的話,棧頂的點就可以輸出了,並把自己的值賦給prevnode,否則自己的右孩子還沒有被訪問,先訪問右孩子。

關鍵**:

if (p->right==null||p->right==prevnode)

else

下面是遞迴和非遞迴的全部**:

已通過空樹和一些普通樹的測試

void preorderrecursive(btn* root)

coutpreorderrecursive(root->left);

preorderrecursive(root->right);

}void inorderrecursive(btn* root)

inorderrecursive(root->left);

coutinorderrecursive(root->right);

}void preorder(btn* root)

stackstk;

stk.push(root);

while (!stk.empty())

return;

}void postorderrecursive(btn* root)

postorderrecursive(root->left);

postorderrecursive(root->right);

cout}void inorder(btn* root)

stackstk;

btn *p=root;

while(p||!stk.empty())

p=stk.top();

stk.pop();

coutp=p->right;

} return;

}void postorder(btn* root)

stackstk;

btn *p=root;

btn *prevnode=null;

while(p||!stk.empty())

p=stk.top();

if (p->right==null||p->right==prevnode)

else

} return;

}

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...