下面**所用到的測試用例畫成樹的樣子長這樣:
建立樹時給的是陣列,用『#』代表非法值,即該結點為空。
二叉樹的遞迴實現:
#pragma once
#include#includeusing namespace std;
templatestruct binarytreenode
t _value;
binarytreenode* _left;
binarytreenode* _right;
};templateclass binarytree
binarytree(t* a, size_t size, const t& invalid)
binarytree(const binarytree& bt)
binarytree& operator=(binarytree& bt) }
~binarytree()
void prevorder()
void inorder()
void postorder()
void levelorder() //層序遍歷
size_t size()
size_t depth()
size_t leafsize()
size_t getklevel(size_t k) //第k層結點個數
protected:
node* _distory(node* root)
return root;
} node* _creattree( t*a, size_t size,size_t& index,const t& invalid)
return root;
} node* _copy(node* copyroot)
return root;
} node* _prevorder(node* root)
return root;
} node* _inorder(node* root)
return root;
} node* _postorder(node* root)
return root;
} void _levelorder(node* root) }
size_t _size(node* root)
return size;
} size_t _depth(node* root)
return depth1 > depth2 ? depth1 : depth2;
} size_t _leafsize(node* root)
private:
node* _root;
};void test()
; int array1[15] = ;
binarytreebt(array, 10, '#');
bt.prevorder();
bt.inorder();
bt.postorder();
cout << bt.size() << endl;
cout << bt.depth() << endl;
cout << bt.leafsize() << endl;
binarytreebt2(array1, 15, '#');
cout << bt2.depth() << endl;
cout << bt2.leafsize() << endl;
binarytreebt3(bt);
bt3.prevorder();
binarytreebt4=bt3;
bt4.prevorder();
bt4.levelorder();
}
遞迴的好處在於**簡練。但遞迴不容易理解。
非遞迴的二叉樹(面試經常會考的):
#pragma once
#include#include#include#includeusing namespace std;
templatestruct binarytreenode
t _value;
binarytreenode* _left;
binarytreenode* _right;
};templateclass binarytree
explicit binarytree(t* a, size_t size, const t& invalid) //建構函式,建立一棵樹。
else
s.push(cur);
}index++;
node* top = s.top();
s.pop();
if ((index < size) && (a[index] != invalid))
}} binarytree(const binarytree& bt) //拷貝構造
else
cur = cur->_left;
s1.push(root);
}node* top = s.top();
node* top1 = s1.top();
s.pop();
s1.pop();
cur = top->_right;
if (cur)
}} binarytree& operator=(binarytreebt)
void prevordernor()
node* top = s.top();
s.pop();
cur = top->_right;
} cout << endl;
} void inordernor()
node* top = s.top();
s.pop();
cout << top->_value << " ";
cur = top->_right;
} cout << endl;
} void postordernor()
node* top = s.top();
if ((top->_right == null) || (prev == top->_right))
else
cur = top->_right;
} cout << endl;
} size_t sizenor()
node* top = s.top();
s.pop();
cur = top->_right;
} return size;
} size_t depthnor()
if (cur->_right)
if (levenum == visitnum)
}return depth;
} size_t levenum() //葉子節點個數
node* top = s.top();
s.pop();
cur = top->_right;
} return count;
} size_t getkleve(size_t k) //得到第k層結點個數。
if (cur->_right)
if (levenum == visitnum)
}return nodenum - visitnum;
}private:
node* _root;
};void test()
; binarytreebt(array, 10, '#');
bt.prevordernor();
bt.inordernor();
bt.postordernor();
binarytreebt1(bt);
bt1.prevordernor();
binarytreebt2 = bt1;
bt2.prevordernor();
cout << bt.sizenor() << endl;
cout << bt.depthnor() << endl;
cout << bt.levenum() << endl;
cout << bt.getkleve(3) << endl;
}
可以看到,非遞迴相對來說**量能多點,但是比較容易理解,而且幾個遍歷過程**十分相似,理解其中乙個,後面幾個都是類似的。 資料結構 二叉樹的遞迴 非遞迴遍歷
複習一下二叉樹遞迴非遞迴的先中後序遍歷 寫非遞迴後序遍歷的時候卡殼了,參考了一下網上的思路,大概有兩種,一種是標記每個節點是否有走過,如果父節點的左右子節點都標記訪問過,則可以訪問父節點 一種是定義乙個指標,指向上乙個訪問的節點,如果某父節點的右子節點為null或者是上乙個訪問的節點,則該父節點應當...
資料結構 18 二叉樹(非遞迴)
二叉樹 使用非遞迴方法,建立樹 前中後序及層級遍歷樹。建立樹時,按照左子樹小於樹根,右子樹大於樹根,這樣中序遍歷就是有序表 include include 層級遍歷時,用到了queue模板類 include 前中後遍歷時,用到了stack模板類 using namespace std class n...
二叉樹的遞迴與非遞迴
include include include include using namespace std templatestruct binarytreenode template class binarytree binarytree t a,size t n,const t invalid bi...