您好,登錄后才能下訂單哦!
非遞歸實現二叉樹主要利用queue和stack的特點,對于層次遍歷二叉樹主要運用queue隊頭出,隊尾插入,先進先出的特點,先將根插入隊尾,然后輸出隊頭的元素,同時將隊頭的左子樹和右子樹元素插入隊尾,依次輸出輸出隊頭的元素,同時將隊頭的左子樹和右子樹元素插入隊尾,直到隊列為空。
void levelorder()
{
queue<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
s.push(_root);
while (!s.empty())
{
BinaryTreeNode<T> *front=s.front();
cout << front->_data << " ";
if (front->_left)
s.push(front->_left);
if (front->_right)
s.push(front->_right);
s.pop();
}
}
非遞歸實現二叉樹前序遍歷主要運用stack的先進后出的特點,先把根壓入棧里,同時先把左子樹的左子樹元素以此壓入棧底,最后左子樹的最后一個元素壓入棧底之后,再將棧底元素彈出棧,再判斷棧底最后一個元素的右子樹,利用以上的方法。代碼如下:
void prevorder()
{
stack<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
s.push(_root);
while (!s.empty())
{
BinaryTreeNode<T> *cur = s.top();
cout << cur->_data << " ";
s.pop();
if (cur->_right)
s.push(cur->_right);
if (cur->_left)
s.push(cur->_left);
}
}
非遞歸實現二叉樹中序遍歷主要運用stack的先進后出的特點,先把根壓入棧里,同時先把左子樹的左子樹元素以此壓入棧底,最后左子樹的最后一個元素壓入棧底之后,判斷棧底最后一個元素的右子樹,利用以上的方法。代碼如下:
void inorder()
{
stack<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
BinaryTreeNode<T> *cur = _root;
while (cur||!s.empty())
{
while (cur)
{
s.push(cur);
cur = cur->_left;
}
cout << s.top()->_data << " ";
cur = s.top()->_right;
s.pop();
}
}
非遞歸實現二叉樹后序遍歷主要運用stack的先進后出的特點,在利用前序和后序的共同特點
void postorder()
{
stack<BinaryTreeNode<T> *>s;
if (_root == NULL)
return;
BinaryTreeNode<T> *cur = _root;
BinaryTreeNode<T> *prev = NULL;
s.push(cur);
while (cur || !s.empty())
{
while (cur->_left&&cur->_left!=prev)
{
s.push(cur->_left);
cur = cur->_left;
}
if (s.top()->_right&&s.top()->_right != prev)
{
cur = s.top()->_right;
s.push(cur);
}
else
{
cout << s.top()->_data << " ";
prev = s.top();
s.pop();
cur = s.top();
cur->_left =NULL;
}
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。