1. 二叉樹分類
滿二叉樹:所有層的節點數均達到了最大值
完全二叉樹:除了最后一層外,所有層的節點數都達到了最大值,最后一層若不滿,則只缺少右邊部分。
平衡二叉樹::它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的高度之差之差的絕對值不超過1。
2. 度為二的節點數和葉子節點數的關系
設二叉樹的葉子節點個數為x,二度節點個數為y,1度節點個數為z,總結點個數為N,則有:
x+y+z= N;
又 N個節點一共有 N-1個樹枝,二度節點有2個樹枝,1度節點有1個,葉子沒有,所以:
2y+z = N-1;
可得出 x = y+1.
3.遍歷
只要給出中根遍歷,先根遍歷和后根遍歷的一種,就能確定一棵二叉樹。
只給出先跟順序和后根順序無法確定一棵二叉樹。例如:
- 樹1:根A和一個左子節點B
- 樹2:根A和一個右子節點B
1.遞歸遍歷
只給出先根遍歷的遞歸代碼:
Java
//先根遍歷
public void preVisit(Node node){
if(node== null){
return;
}
System.out.println(node.val);
preVisit(node.left);
preVisit(node.right);
}
2.非遞歸遍歷:
```Java```
//非遞歸先根遍歷,
//1 對每個節點,先進行訪問,然后右節點進棧,左節點進棧
//2 彈出棧頂,對棧頂進行1的操作
public void nonRecursivePre(TreeNode node) {
if (node == null) {
return;
}
Stack<TreeNode> nodeStack = new Stack<>();
nodeStack.push(node);
while (!nodeStack.empty()) {
TreeNode peek = nodeStack.pop();
System.out.print(peek.val);
if (peek.right != null) {
nodeStack.push(peek.right);
}
if (peek.left != null) {
nodeStack.push(peek.left);
}
}
}
//中根遍歷
public void nonRecursiveMiddle(TreeNode node) {
if (node != null) {
Stack<TreeNode> nodeStack = new Stack<>();
while (node != null || !nodeStack.empty()) {
while (node != null) {
nodeStack.push(node);
node = node.left;
}
node = nodeStack.pop();
System.out.print(node.val);
node = node.right;
}
}
}
//后根遍歷
public void nonRecursiveAfter(TreeNode node) {
if (node != null) {
Stack<TreeNode> nodeStack = new Stack<>();
TreeNode pre = null;
while (node != null || !nodeStack.empty()) {
while (node != null) {
nodeStack.push(node);
node = node.left;
}
node = nodeStack.peek();
if (node.right == null || node.right.equals(pre)) {
System.out.print(node.val);
pre = node;
nodeStack.pop();
node = null;
} else {
node = node.right;
}
}
}
}