遍历方式:
- 前序遍历:根结点->左子树->右子树
- 中序遍历:左子树->根结点->右子树
- 后序遍历:左子树->右子树->根结点
- 层次遍历:从最高层到最底层每层从左向右遍历
例如下图中的二叉搜索树
- 前序遍历:8 3 1 6 4 7 10 14 13
- 中序遍历:1 3 4 6 7 8 10 13 14
- 后序遍历:1 4 7 6 3 13 14 10 8
- 层次遍历:8 3 10 1 6 14 4 7 13
对于二叉搜索树,中序遍历的结果为二叉树中的结点值从小到大排序的结果。
代码:
树的结构:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
前序遍历:
递归版本:
void preOrder(TreeNode* Root){
if(Root){
cout << Root->val;
preOrder(Root->left);
preOrder(Root->right);
}
非递归版本:
void preOrder(TreeNode* root) {
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* Node = s.top();
s.pop();
if (Node) {
if (Node->right)
s.push(Node->right);
if (Node->left)
s.push(Node->left);
s.push(Node);
s.push(nullptr);
}
else {
cout << s.top()->val << " ";
s.pop();
}
}
}
中序遍历:
递归版本:
void inOrder(TreeNode* Root) {
if (Root) {
inOrder(Root->left);
cout << Root->val;
inOrder(Root->right);
}
}
非递归版本:
void inOrder(TreeNode* root) {
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* Node = s.top();
s.pop();
if (Node) {
if (Node->right)
s.push(Node->right);
s.push(Node);
s.push(nullptr);
if (Node->left)
s.push(Node->left);
}
else {
cout << s.top()->val << " ";
s.pop();
}
}
}
后序遍历:
递归版本:
void postOrder(TreeNode* Root) {
if (Root) {
postOrder(Root->left);
postOrder(Root->right);
cout << Root->val;
}
}
非递归版本:
void postOrder(TreeNode* root) {
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* Node = s.top();
s.pop();
if (Node) {
s.push(Node);
s.push(nullptr);
if (Node->right)
s.push(Node->right);
if (Node->left)
s.push(Node->left);
}
else {
cout << s.top()->val << " ";
s.pop();
}
}
}
层次遍历:
void level(TreeNode* Root) {
if (!Root)
return;
queue<TreeNode*> queue1;
queue1.push(Root);
while (!queue1.empty()) {
TreeNode* Node = queue1.front();
cout << Node->val;
if (Node->left) {
queue1.push(Node->left);
}
if (Node->right) {
queue1.push(Node->right);
}
queue1.pop();
}
}
求二叉树深度
int treeDepth(TreeNode* root)
{
if(!root)
return 0;
int leftdepth = treeDepth(root->left);
int rightdepth = treeDepth(root->right);
return leftdepth > rightdepth ? leftdepth + 1 : rightdepth + 1;
}