1、二叉树的分层遍历(宽度优先搜索)
2、从上往下打印出二叉树的每个节点,同层节点从左至右打印
这个和第一题基本相同,依靠vector保存访问,queue队列实现遍历
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> que;
queue<TreeNode*>q;
TreeNode* fr;
if(root == NULL) return que;
q.push(root);
while(!q.empty())
{
fr=q.front();
que.push_back(fr->val);
if(fr->left != NULL)
q.push(fr->left);
if(fr->right != NULL)
q.push(fr->right);
q.pop();
}
return que;
}
3、二叉树的前序遍历(深度优先搜索)
void preTravel(TreeNode root)
{
if(root==NULL)
return;
stack<TreddNode>s;
s.push(root);
while(!s.empty())
{
TreeNode cur=s.top();
s.pop();
cout<<"visited "<<cur.val<<endl;
if(cur.right!=null)
s.push(cur.right);
if(cur.left!=null)
s.push(cur.left);
}
}
这里压入栈中的顺序要注意是先右后左,因为后进的先出。
4、给一个二叉树,展开为链表
void flatten(TreeNode root)
{
if(!root)
return;
if(root->left)
flatten(root->left);
if(root->right)
flatten(root->right);
TreeNode *tmp=root->right;
root->right=root->left;
root->left=NULL;
while(root->right)
root=root->right;
root->right=tmp;
}
5二叉树的下一个
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
TreeLinkNode* GetNext(TreeLinkNode* p)
{
//该节点有右子树,则右子树中最左面的是下一个结点
if(p->right)
{
p = p->right;
while(p->left) p = p->left;
return p;
}
//如果当前节点没有右子树,则一直向上找到第一个有右儿子的节点,该节点下一个就是后继。
while(p->next && p == p->next->right) p = p->next;
return p->next;
}
6 写出中序遍历的非递归算法
借助栈,可以将二叉树的递归算法转换为非递归算法,中序遍历先扫描根节点的所有左节点,将它们一一进栈,然后出栈一个p访问它,扫描该节点的右子树,将其进栈,再扫描这个右子树中的所有左节点,如此继续直到栈空,出栈顺序就是 (左-根-右)
void InOrder2(BiTress T)
{
stack<BiTress>s;
BiTree p=T;
while(p||!s.(empty))
{
if(p)
{
s.push(p);
p=p->lchild;
}
else
{
p=s.top();
s.pop();
visit(p);
p=p->rchild;
}
}
}
时间限制:1秒 空间限制:32768K 热度指数:221766
本题知识点: 栈 树
题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
class Solution {
public:
int count=0;
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if (pRoot != NULL)
{
TreeNode* node= KthNode(pRoot->left,k);
if (node != NULL)
return node;
count++;
if (count == k)
return pRoot;
node= KthNode(pRoot->right,k);
if (node != NULL)
return node;
}
return NULL;
}
};
后续更新在这里
https://blog.csdn.net/weixin_44611644/article/details/97104367