一、二叉树
1、用递归方法实现二叉树的先序、中序、后序遍历
class
TreeToSequence {
public
:
void
preOrder(TreeNode* root,vector<
int
> &pre) {
if
(!root)
return
;
pre.push_back(root->val);
preOrder(root->left,pre);
preOrder(root->right,pre);
}
void
inOrder(TreeNode* root,vector<
int
> &in) {
if
(!root)
return
;
inOrder(root->left,in);
in.push_back(root->val);
inOrder(root->right,in);
}
void
postOrder(TreeNode* root,vector<
int
> &post) {
if
(!root)
return
;
postOrder(root->left,post);
postOrder(root->right,post);
post.push_back(root->val);
}
vector<vector<
int
> > convert(TreeNode* root) {
vector<vector<
int
> > vRecur;
vector<
int
> pre,in,post;
preOrder(root,pre);
inOrder(root,in);
postOrder(root,post);
vRecur.push_back(pre);
vRecur.push_back(in);
vRecur.push_back(post);
return
vRecur;
}
};
2、用非递归方法实现二叉树的先序、中序、后序遍历
class
TreeToSequence {
public :
vector<
int
> preOrder(TreeNode* root) {
vector<
int
> pre;
stack<TreeNode*> s;
s.push(root);
while
(!s.empty()) {
TreeNode* temp = s.top();
pre.push_back(temp->val);
s.pop();
if
(temp->right)
s.push(temp->right);
if
(temp->left)
s.push(temp->left);
}
return
pre;
}
vector<
int
> inOrder(TreeNode* root) {
vector<
int
> in;
stack<TreeNode*> s;
TreeNode* temp = root;
while
(temp || !s.empty()){
while
(temp) {
s.push(temp);
temp = temp->left;
}
temp = s.top();
s.pop();
in.push_back(temp->val);
temp = temp->right;
}
return
in;
}
vector<
int
> postOrder(TreeNode* root) {
vector<
int
> post;
stack<TreeNode*> s;
TreeNode *temp = root,*previsited =
NULL
;
while
(temp || !s.empty()){
while
(temp) {
s.push(temp);
temp = temp->left;
}
temp = s.top();
if
(!temp->right || temp->right == previsited) {
post.push_back(temp->val);
s.pop();
previsited = temp;
temp =
NULL
;
}
else
temp = temp->right;
}
return
post;
}
vector<vector<
int
> > convert(TreeNode* root) {
vector<vector<
int
> > vNonRecur;
if
(!root)
return
vNonRecur;
vNonRecur.push_back(preOrder(root));
vNonRecur.push_back(inOrder(root));
vNonRecur.push_back(postOrder(root));
return
vNonRecur;
}
};
3、按照层次打印二叉树,且不同层的数据要打印在不同行。可把不同层的数据存在不同的数组中模拟打印过程。
解法:①二叉树的层序遍历要用到队列。队头结点出队则接着将其左右子节点入队。
②不同层打印在不同行就要考虑在合适的节点处换行。定义两个指针curLast和nexLast分别记录正在打印的行的最右结点和下一行的最右结点。nexLast跟踪入队结点,则当打印结点是当前层最右结点curLast时紧接着的入队结点也是下一行的最右结点;若当前打印的结点为curLast则换行,接着将下一行最右结点指针nexLast赋值给curLast。
public :
vector<vector<
int
> > printTree(TreeNode* root) {
vector<vector<
int
> > res;
vector<
int
> temp;
queue<TreeNode*> q;
TreeNode *curLast = root,*nexLast = NULL,*cur;
q.push(root);
while
(!q.empty()) {
cur = q.front();
temp.push_back(cur->val);
q.pop();
if
(cur->left) {
q.push(cur->left);
nexLast = cur->left;