二叉树的遍历
preOrderTraversal
1 | struct TreeNode { |
1 | #先序简单 |
inOrderTraversal
1 | struct TreeNode { |
只是简单的把先序遍历28行挪了一下
1 | vector<int> postorderTraversal(TreeNode* root) |
postOrderTraversal
1 | struct TreeNode { |
1 | #后序拿offer算法 |
多叉树层序遍历
这个和多叉树的非递归深度重复
1 | class Node { |
如果是二叉树只需要两个循环就可以了,因为最内层循环只需要改成左右子树即可
判断子树
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
1 | bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) |
需要注意得地方是返回bool判断左树右树的逻辑
多叉树最大深度
题意为输出多叉树最大深度,最容易想到的方式是递归,该题记录重点为第二种非递归方式,其实也相当于多叉树的层序遍历。
递归
1 | #include<iostream> |
非递归
1 | #include<iostream> |
注意,两个方法中的
if(!root)
作用并不一样,对于递归而言是跳出条件,而对于非递归而言只是一种情况
二叉树镜像
把一个二叉树变为镜像
1 | void Mirror(TreeNode *pRoot) |
对称二叉树
1 | bool judge(TreeNode* p,TreeNode* q) |
树的子结构(或子树)
给定两棵二叉树A和B,判断A是不是B的子结构或子树,子结构要求A是B的一部分即可,但是子树要求叶子结点也得相同.
1 | bool judgeSubTree(TreeNode *pRoot1, TreeNode *pRoot2) |
二叉树中路径和
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
1 | vector<vector<int>> result; |
二叉树所有路径中和最大
这里的路径指的是树上所有能联通的两个节点之间的路径
1 | int maxSumResult = 0; |
调用maxPathSum后maxSumResult得到的就是最大路径和
判断是不是平衡二叉树
1 | int getHeight(TreeNode* root,bool& ifBalance) |
next指针
完全二叉树增加next指针指向右侧节点
只适用于完全二叉树
1 | Node *connectCore(Node *root) |
层序遍历,适用于任何形式的二叉树
1 | Node *connect(Node *root) |
二叉树从右向左看
1 | void fromRight(TreeNode* root,vector<int>& result,int deep) |
这是用中右左的方式遍历,若从左向右看可以中左右的方式遍历
找到最近公共祖先
1 | TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q) |
二叉树最大宽度
还不知道咋解决溢出问题…先这样
BFS
1 | int widthOfBinaryTree(TreeNode *root) |
DFS
1 | int result = 0; |
判断二叉搜索树
1 | bool isValidDFS(TreeNode *root, long low, long high) |
更大的二茬搜索
1 | int currVal = 0; |
判断完全二叉树
1 | bool isCompleteTree(TreeNode *root) |
二叉树中序遍历的前驱和后继
前驱:
1.如果当前节点有左子树则找左子树的最右
2.如果当前节点没有左子树则找其父节点,直到某节点是父节点的右子树,返回该父节点
1 | struct TreeLinkNode { |
后继
1.如果当前节点右右子树则找右子树的最左
2.如果当前节点没有右子树则找其父节点,直到该某节点是父节点的左子树,返回该父节点.
1 | struct TreeLinkNode |