二叉树
前序遍历: A B D H I E J C F G
中序遍历: H D I B J E A F C G
后序遍历: H I D J E B F G C A
层次遍历: A B C D E F G H I J
前序遍历: 第一步:访问根节点,第二步:先序遍历根节点的左子树;第三步:先序遍历根节点的右子树。
中序遍历: 第一步:中序遍历根节点的左子树,第二步:访问根节点; 第三步:中序遍历根节点的右子树。
后序遍历: 第一步:后序遍历根节点的左子树;第二步:后序遍历根节点的右子树;第三步:访问根节点。
PS:只有先序和后序遍历是无法确定一个准确固定一个二叉树的
在递归情况下,我们可以如此写代码
//前序遍历
public void postOrder(Node localRoot){
if(localRoot !=null){
System.out.println(localRoot.data);
postOrder(localRoot.left);//左子树
postOrder(localRoot.right);//右子树
}
}
//中序遍历
public void postOrder(Node localRoot){
if(localRoot !=null){
postOrder(localRoot.left);//左子树\
System.out.println(localRoot.data);
postOrder(localRoot.right);//右子树
}
}
//后序遍历
public void postOrder(Node localRoot){
if(localRoot !=null){
postOrder(localRoot.left);//左子树
postOrder(localRoot.right);//右子树
System.out.println(localRoot.data);
}
}
在非递归的情况下,我们借助Stack的先进后出来实现遍历
// 用非递归的方法进行先序遍历
public void qinaxuFeiDigui(TreeNode treeNode) {
Stack<TreeNode> stack = new Stack<TreeNode>();
while (treeNode != null || !stack.isEmpty()) {
while (treeNode != null) {
qianxuNumList.add(treeNode.val);
stack.push(treeNode);
treeNode = treeNode.left;
}
if(!stack.isEmpty()){
treeNode = stack.pop();
treeNode = treeNode.right;
}
}
}
// 用非递归的方法进行中序遍历
public void zhongxuFeiDigui(TreeNode treeNode) {
Stack<TreeNode> stack = new Stack<TreeNode>();
while (treeNode != null || !stack.isEmpty()) {
while (treeNode != null) {
stack.push(treeNode);
treeNode = treeNode.left;
}
if (!stack.isEmpty()) {
treeNode = stack.pop();
zhongxuNumList.add(treeNode.val);
treeNode = treeNode.right;
}
}
}
// 用非递归的方法进行后序遍历
public void houxuFeiDigui(TreeNode treeNode) {
Stack<TreeNode> stack = new Stack<TreeNode>();
while (treeNode != null || !stack.isEmpty()) {
while (treeNode != null) {
stack.push(treeNode);
treeNode = treeNode.left;
}
boolean tag = true;
TreeNode preNode = null; // 前驱节点
while (!stack.isEmpty() && tag == true) {
treeNode = stack.peek();
if (treeNode.right == preNode) { // 之前访问的为空节点或是栈顶节点的右子节点
treeNode = stack.pop();
houxuNumList.add(treeNode.val);
if (stack.isEmpty()) {
return;
} else {
preNode = treeNode;
}
} else {
treeNode = treeNode.right;
tag = false;
}
}
}
}``