首页 > 代码库 > 遍历二叉树
遍历二叉树
二叉树
定义:每个结点最多有两个子树的树
?
1 2 3 4 5 6 | struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode( int x) : val(x), left(NULL), right(NULL) {} }; |
基本操作:
1. 先序遍历 :先访问根节点,在访问左子树,最后访问右子树
?
1 2 3 4 5 6 7 8 9 | void PreOrderVisit(TreeNode *root) { if (root == NULL) return ; cout << root->val << endl; PreOrderVisit(root->left); PreOrderVisit(root->right); } |
2. 中序遍历:先访问左子树,在访问根节点,最后访问右子树
?
1 2 3 4 5 6 7 8 9 | void PreOrderVisit(TreeNode *root) { if (root == NULL) return ; PreOrderVisit(root->left); cout << root->val << endl; PreOrderVisit(root->right); } |
3. 后序遍历:先访问左子树,在访问右子树,最后访问根节点
?
1 2 3 4 5 6 7 8 9 | void PreOrderVisit(TreeNode *root) { if (root == NULL) return ; PreOrderVisit(root->left); PreOrderVisit(root->right); cout << root->val << endl; } |
可见,所谓的前序,中序,后序遍历仅仅是由访问根节点的顺序决定。
4. 层次遍历 : 一层一层访问
借助一个队列,将每一层的结点都存放于队列中,从队列中取数据。
那么如何记录一层呢,可以通过记录每层的个数。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | void LevelVisit(TreeNode *root) { if (root == NULL) return ; deque<TreeNode*> q; q.push_back(root); int levelNum = 0; while (!q.empty()) { levelNum = q.size(); while (levelNum > 0) { TreeNode *node = q.front(); q.pop_front(); levelNum--; cout << node->val << " " ; if (root->left != NULL) q.push_back(root->left); if (root->right != NULL) q.push_back(root->right); } cout << endl; } } |
5. 求树的高度
?
1 2 3 4 5 6 7 8 9 10 | int Height(Tree *root) { if (root == NULL) return 0; int lh = Height(root->left); int rh = Height(root->right); return max(lh, rh) + 1; } |
基本操作应该就这些,还是很简单的。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。